本程序实现的是求两个大数的最大公约数,实现的方式是将大数存储在字符数组中,然后通过操作数组来实现求公约数,但是调试过程中出现了输入字符串格式异常!其中各个函数的模块我独立调试过都正确!不过合并到一块时就出现上述的输入字符串格式异常错误,就各位大神指导啊!很急用啊
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]);// } }
}
}
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]);// } }
}
}
解决方案 »
- 未在本地计算机上注册“Microsoft.Jet.OLEDB.12.0”提供程序。
- 如何使用wsHttpBinding
- 如何实现不是以本地时间为基准的时间的加减?
- Binding的问题,对Control的绑定机制有研究的来看看
- WinForm用webBrowser获得网页表单发送到服务器的数据
- 求在北京的高手相助(付费)
- C#怎么还原这段js,winform下
- 我没分了,三发TCP的问题
- 求c#写的winform数据库程序,要有主细表或用datagrid。能给个源码多的网站就更好了。
- 怎么让datagrid自动创建列的时候生成超级链接列??
- winform下题库管理系统中显示用什么控件
- .net调用delphi的dll,知道的兄弟支个招,不胜感激
{
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]); // } }
}
很遗憾,结果不正确,看来你还得调试