本程序实现的是求两个大数的最大公约数,实现的方式是将大数存储在字符数组中,然后通过操作数组来实现求公约数,但是调试过程中出现了输入字符串格式异常!其中各个函数的模块我独立调试过都正确!不过合并到一块时就出现上述的输入字符串格式异常错误,就各位大神指导啊!很急用啊
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 公约数
{
classProgram
    {
publicstaticbool compare(char[] a, char[] b)
        {
int len1 = a.Length;
int len2 = b.Length;
int m = 0;
int n = 0;
//string a1=a.ToString();
// string b1=b.ToString();
if (len1 != len2)
return len1 > len2 ? true : false;
else
            {
bool k = true;
for (int j = 0; j < len1; j++)
                {
                     m = int.Parse(a[j].ToString());
                     n = int.Parse(b[j].ToString());
if (m > n) break;
if (m < n) { k = false; break; }
continue;
                }
return k;
            }        }
publicstaticchar[] sub(char[] a, char[] b)
        {
// const  int max = 102;
if (a.Equals(b))
            {
char[] c = newchar[20000];
return c;            }
int[] cm = newint[20000];
int[] cs = newint[20000];
int[] cd = newint[20000];
int lenm = a.Length; int lens = b.Length;
int lenmin = lenm < lens ? lenm : lens;
// int flag;
int i;
if (compare(a, b))
            {
//flag = 0;
for (int p = 0; p < lenm; p++)
                {
                    cm[p] =int.Parse(a[lenm - 1 - p].ToString());
                }
for (int t = 0; t < lens; t++)
                {
                    cs[t] =int.Parse(b[lens - 1 - t].ToString());
                }            }
else
            {
//flag = 1;
for (int g = 0; g < lenm; g++)
                {
                    cs[g] =int.Parse(a[lenm - 1 - g].ToString());
                }
for (int c = 0; c < lens; c++)
                {
                    cm[c] =int.Parse(b[lens - 1 - c].ToString());
                }
            }
for (i = 0; i < lenmin; i++)
            {
if (cm[i] >= cs[i])
                    cd[i] = cm[i] - cs[i];
else
                {
                    cd[i] = cm[i] + 10 - cs[i];
                    --cm[i + 1];
                }
            }
int len = lenm > lens ? lenm : lens;
while (i < len)
            {
if (cm[i] >= 0)
                    cd[i] = cm[i];
else
                {
                    cd[i] = cm[i] + 10;
                    --cm[i + 1];
                }
                i++;
            }
while (cd[i - 1] == 0)
                i--;
char[] d = newchar[20000];
for (int k = i - 1; k >= 0; k--)
            {
                d[i - 1 - k] =char.Parse(cd[k].ToString());
            }
return d;
        }
publicstaticchar[] mul(char[] x)//大数乘2运算
        {
int temp = 0;//进位标志
int temp2;//临时变量
int k = 0;//记录最后乘积的位数
char[] temp1 = newchar[20000];//存储临时的乘积
for (int i = x.Length - 1; i >= 0; i--)
            {
                temp2 =int.Parse(x[i].ToString());
                temp2 = temp2 * 2;
                temp2 = temp2 + temp;
if (temp2 >= 10)
                {
                    temp2 = temp2 - 10;
                    temp1[k++] =char.Parse(temp2.ToString());
                    temp = 1;
                }
else
                {
                    temp1[k++] =char.Parse(temp2.ToString());
                    temp = 0;
                }
            }
if (temp == 1)//最高位有进位
            {
                temp1[k++] =char.Parse(temp.ToString());
            }
char[] temp4 = newchar[20000];//定义最终的存储乘积的字符数组
for (int i = 0; temp1[i] != '\0'; i++)
            {
                temp4[k - 1 - i] = temp1[i];
            }
return temp4;
        }
publicstaticchar[] div(char[] x)//大数除2
        {
char[] str5 = newchar[20000];//定义一个存储临时商的字符数组
int str1;//临时变量
int k = 1;
int str2 = int.Parse(x[x.Length - 1].ToString());//获取被除数的最低位
switch (str2)
            {
case 0:
                    str5[0] = '0'; break;
case 2:
                    str5[0] = '1'; break;
case 4:
                    str5[0] = '2'; break;
case 6:
                    str5[0] = '3'; break;
case 8:
                    str5[0] = '4'; break;
            }
for (int i = x.Length - 2; i >= 0; i--)
            {
                str1 = int.Parse(x[i].ToString());
switch (str1)
                {
case 0:
//str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString())).ToString());
                        str5[k++] = '0';
break;
case 1:
                        str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString()) + 5).ToString());
                        str5[k++] = '0';
break;
case 2:
// str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString())).ToString());
                        str5[k++] = '1';
break;
case 3:
                        str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString()) + 5).ToString());
                        str5[k++] = '1';
break;
case 4:
// str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString()) + 0).ToString());
                        str5[k++] = '2';
break;
case 5:
                        str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString()) + 5).ToString());
                        str5[k++] = '2';
break;
case 6:
// str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString()) + 0).ToString());
                        str5[k++] = '3';
break;
case 7:
                        str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString()) + 5).ToString());
                        str5[k++] = '3';
break;
case 8:
//str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString()) + 0).ToString());
                        str5[k++] = '4';
break;
case 9:
                        str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString()) + 5).ToString());
                        str5[k++] = '4';
break;
                }
            }
char[] str3 = newchar[20000];
int str6 = 0;
int str7 = 0;
for (int l = k - 1; l >= 0; l--)
            {
                str3[k - 1 - l] = str5[l];
            }
while (str3[str6] == '0')
                str6++;
//if (str3[0] == 0)
// {
for (int i = str6; str3[i] != '\0'; i++)
            {
                str3[str7++] = str3[i];
                str3[i] = '\0';
            }
// }
return str3;
        }
publicstaticbool iseven(char[] x)//判断数值是不是偶数
        {
bool flag = false;
int a1 =int.Parse( x[x.Length - 1].ToString());
if (a1 % 2 == 0) flag = true;
return flag;
        }
publicstaticbool iszero(char[] x)//判断数值是否已经为零
        {
bool flag = true;
for (int i = 0; i < x.Length; i++)
            {
if (x[i] != '0')
                {
                    flag = false;
break;
                }
            }
return flag;
        }
publicstaticchar[] gcd(char[] x, char[] y)
        {//if (!compare(x,y))
// {
// return gcd(y, x);
//}
if (iszero(y))
            {
return x;
            }
else
            {
if (iseven(x))
                {
if (iseven(y))
                    {
char[] t1 = div(x);
char[] t2 = div(y);
char[] t3= gcd(t1,t2);
char[] t4 = mul(t3);
return t4;
                    }
else
                    {
char[] r1 = div(x);
return gcd(r1, y);
                    }
                }
else
                {
if (iseven(y))
                    {
char[] r2 = div(y);
return gcd(x,r2);
                    }
else
                    {
char[] r3 = sub(x, y);
return gcd(y,r3);
                    }
                }
            }
        }
staticvoid Main(string[] args)
        {// for (int i = 0; i < 100; i++)
// {
// Console.WriteLine("\r\n");
Console.WriteLine("请输入两个要求最大公约数的大数:" + "\r\n");
Console.WriteLine("第一个数:");
string a1 = Console.ReadLine();
char[] a2 = a1.ToCharArray();
//Console.WriteLine("\r\n");
Console.WriteLine("第二个数:");
string b1 = Console.ReadLine();
char[] b2 = b1.ToCharArray();
//Console.WriteLine("\r\n");
char[] c = gcd(a2,b2);
for (int y = 0;c[y]!='\0'; y++)
Console.Write(c[y]);//  }        }
    }
}

解决方案 »

  1.   

    0<a,b<=10的(100次方) 每次抛出的异常的都是输入格式不对,行数不唯一!你有安装vs吗,可以运行下!这里貌似不好发截图!
      

  2.   

    第一次在csdn上发帖,有些地方还不熟悉!不好意思,刚才的截图貌似没有上传上。希望大家帮帮忙啊!这程序我真的很急,在这里先谢谢各位前辈啊!
      

  3.   

    class Program
    {
    public static bool compare(char[] a, char[] b)
    {
    int len1 = new string(a).TrimEnd(new char[] { '\0' }).Length;
    int len2 = new string(b).TrimEnd(new char[] { '\0' }).Length;
    int m = 0;
    int n = 0;
    //string a1=a.ToString();
    // string b1=b.ToString();
    if(len1 != len2)
    return len1 > len2 ? true : false;
    else
    {
    bool k = true;
    for(int j = 0; j < len1; j++)
    {
    m = int.Parse(a[j].ToString());
    n = int.Parse(b[j].ToString());
    if(m > n) break;
    if(m < n) { k = false; break; }
    continue;
    }
    return k;
    } }
    public static char[] sub(char[] a, char[] b)
    {
    // const  int max = 102;
    if(a.Equals(b))
    {
    char[] c = new char[20000];
    return c; }
    int[] cm = new int[20000];
    int[] cs = new int[20000];
    int[] cd = new int[20000];
    int lenm = new string(a).TrimEnd(new char[] { '\0' }).Length; int lens = new string(b).TrimEnd(new char[] { '\0' }).Length;
    int lenmin = lenm < lens ? lenm : lens;
    // int flag;
    int i;
    if(compare(a, b))
    {
    //flag = 0;
    for(int p = 0; p < lenm; p++)
    {
    cm[p] = int.Parse(a[lenm - 1 - p].ToString());
    }
    for(int t = 0; t < lens; t++)
    {
    cs[t] = int.Parse(b[lens - 1 - t].ToString());
    } }
    else
    {
    //flag = 1;
    for(int g = 0; g < lenm; g++)
    {
    cs[g] = int.Parse(a[lenm - 1 - g].ToString());
    }
    for(int c = 0; c < lens; c++)
    {
    cm[c] = int.Parse(b[lens - 1 - c].ToString());
    }
    }
    for(i = 0; i < lenmin; i++)
    {
    if(cm[i] >= cs[i])
    cd[i] = cm[i] - cs[i];
    else
    {
    cd[i] = cm[i] + 10 - cs[i];
    --cm[i + 1];
    }
    }
    int len = lenm > lens ? lenm : lens;
    while(i < len)
    {
    if(cm[i] >= 0)
    cd[i] = cm[i];
    else
    {
    cd[i] = cm[i] + 10;
    --cm[i + 1];
    }
    i++;
    }
    while(cd[i - 1] == 0)
    i--;
    char[] d = new char[20000];
    for(int k = i - 1; k >= 0; k--)
    {
    d[i - 1 - k] = char.Parse(cd[k].ToString());
    }
    return d;
    }
    public static char[] mul(char[] x)//大数乘2运算
    {
    int temp = 0;//进位标志
    int temp2;//临时变量
    int k = 0;//记录最后乘积的位数
    char[] temp1 = new char[20000];//存储临时的乘积
    for(int i = new string(x).TrimEnd(new char[] { '\0' }).Length - 1; i >= 0; i--)
    {
    temp2 = int.Parse(x[i].ToString());
    temp2 = temp2 * 2;
    temp2 = temp2 + temp;
    if(temp2 >= 10)
    {
    temp2 = temp2 - 10;
    temp1[k++] = char.Parse(temp2.ToString());
    temp = 1;
    }
    else
    {
    temp1[k++] = char.Parse(temp2.ToString());
    temp = 0;
    }
    }
    if(temp == 1)//最高位有进位
    {
    temp1[k++] = char.Parse(temp.ToString());
    }
    char[] temp4 = new char[20000];//定义最终的存储乘积的字符数组
    for(int i = 0; temp1[i] != '\0'; i++)
    {
    temp4[k - 1 - i] = temp1[i];
    }
    return temp4;
    }
    public static char[] div(char[] x)//大数除2
    {
    char[] str5 = new char[20000];//定义一个存储临时商的字符数组
    int str1;//临时变量
    int k = 1;
    string strTemp = new string(x).TrimEnd(new char[] { '\0' });
    int str2 = int.Parse(strTemp[strTemp.Length - 1].ToString());//获取被除数的最低位
    switch(str2)
    {
    case 0:
    str5[0] = '0'; break;
    case 2:
    str5[0] = '1'; break;
    case 4:
    str5[0] = '2'; break;
    case 6:
    str5[0] = '3'; break;
    case 8:
    str5[0] = '4'; break;
    }
    for(int i = strTemp.Length - 2; i >= 0; i--)
    {
    str1 = int.Parse(x[i].ToString());
    switch(str1)
    {
    case 0:
    //str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString())).ToString());
    str5[k++] = '0';
    break;
    case 1:
    str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString()) + 5).ToString());
    str5[k++] = '0';
    break;
    case 2:
    // str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString())).ToString());
    str5[k++] = '1';
    break;
    case 3:
    str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString()) + 5).ToString());
    str5[k++] = '1';
    break;
    case 4:
    // str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString()) + 0).ToString());
    str5[k++] = '2';
    break;
    case 5:
    str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString()) + 5).ToString());
    str5[k++] = '2';
    break;
    case 6:
    // str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString()) + 0).ToString());
    str5[k++] = '3';
    break;
    case 7:
    str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString()) + 5).ToString());
    str5[k++] = '3';
    break;
    case 8:
    //str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString()) + 0).ToString());
    str5[k++] = '4';
    break;
    case 9:
    str5[k - 1] = char.Parse((int.Parse(str5[k - 1].ToString()) + 5).ToString());
    str5[k++] = '4';
    break;
    }
    }
    char[] str3 = new char[20000];
    int str6 = 0;
    int str7 = 0;
    for(int l = k - 1; l >= 0; l--)
    {
    str3[k - 1 - l] = str5[l];
    }
    while(str3[str6] == '0')
    str6++;
    //if (str3[0] == 0)
    // {
    for(int i = str6; str3[i] != '\0'; i++)
    {
    str3[str7++] = str3[i];
    str3[i] = '\0';
    }
    // }
    return str3;
    }
    public static bool iseven(char[] x)//判断数值是不是偶数
    {
    string strTemp = new string(x).TrimEnd(new char[]{'\0'});
    bool flag = false;
    int a1 = int.Parse(strTemp[strTemp.Length - 1].ToString());
    if(a1 % 2 == 0) flag = true;
    return flag;
    }
    public static bool iszero(char[] x)//判断数值是否已经为零
    {
    bool flag = true;
    string strTemp = new string(x).TrimEnd(new char[] { '\0' });
    for(int i = 0; i < strTemp.Length; i++)
    {
    if(x[i] != '0')
    {
    flag = false;
    break;
    }
    }
    return flag;
    }
    public static char[] gcd(char[] x, char[] y)
    { //if (!compare(x,y))
    // {
    // return gcd(y, x);
    //}
    if(iszero(y))
    {
    return x;
    }
    else
    {
    if(iseven(x))
    {
    if(iseven(y))
    {
    char[] t1 = div(x);
    char[] t2 = div(y);
    char[] t3 = gcd(t1, t2);
    char[] t4 = mul(t3);
    return t4;
    }
    else
    {
    char[] r1 = div(x);
    return gcd(r1, y);
    }
    }
    else
    {
    if(iseven(y))
    {
    char[] r2 = div(y);
    return gcd(x, r2);
    }
    else
    {
    char[] r3 = sub(x, y);
    return gcd(y, r3);
    }
    }
    }
    }
    static void Main(string[] args)
    { // for (int i = 0; i < 100; i++)
    // {
    // Console.WriteLine("\r\n");
    Console.WriteLine("请输入两个要求最大公约数的大数:" + "\r\n");
    Console.WriteLine("第一个数:");
    string a1 = Console.ReadLine();
    char[] a2 = a1.ToCharArray();
    //Console.WriteLine("\r\n");
    Console.WriteLine("第二个数:");
    string b1 = Console.ReadLine();
    char[] b2 = b1.ToCharArray();
    //Console.WriteLine("\r\n");
    char[] c = gcd(a2, b2);
    for(int y = 0; c[y] != '\0'; y++)
    Console.Write(c[y]); //  } }
    }
    很遗憾,结果不正确,看来你还得调试
      

  4.   

    Quote: 引用 5 楼 nickppa 的回复:

    期待大神出现啊!我都调试整整两天了!就是不懂哪里出问题了!什么输入格式异常啊?
      

  5.   

    我不是帮你改了下吗,你就照着我的代码继续调,你原先的x[x.Length - 1].ToString(),你这里传进来的x要是char[2000]的话x[x.Length - 1].ToString()取到的是"\0"