【算法】相关题目汇总(持续更新)
余初学算法,题目较易,望诸大神指正而勿喷。
一、将一个正整数分解质因数。例如:输入90,打印出打印出90=2*3*3*5。
static void Main(string[] args) { //题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 Console.WriteLine("Please input a number: "); string str = Console.ReadLine(); int n = Convert.ToInt32(str); int i = 0; Console.Write("{0}=",n);//确保打印出"n=..." for (i = 2; i <= n; i++) { while (n!=i) { if (n % i == 0)//说明此时i是n的一个质因数 { Console.Write("{0}*", i); n /= i;//将n整除i后的值继续赋给n,来寻找下一个质因数。如果不用整除后的值,则下一次能够整除得到的不是质因数。 } else break; } } Console.Write(n); }
二、输入两个正整数m和n,求其最大公约数和最小公倍数。
两种方案:1、欧几里德算法(辗转相除法);2、更相减损术
static void Main(string[] args) { //题目:输入两个正整数,求其最大公约数和最小公倍数。 Console.WriteLine("Please input two numbers: "); string str1 = Console.ReadLine(); string str2 = Console.ReadLine(); int a = Convert.ToInt32(str1); int b = Convert.ToInt32(str2); //辗转相除法(欧几里德算法)
//概述:不断地用大数除以小数,直到两数可以整除,则最后的被除数就为最大公约数。
if (a<b)//确保a是最大值 { int temp; temp = a; a = b; b = temp; } int m=a; int n=b; while (n!=0)//此时的n储存的是m除以n的余数,判断余数是否为0即判断n是否为0 { int r = m % n;//r即为m与n相除的余数 m = n;//将除数变为被除数 n = r;//将余数变为除数 } Console.WriteLine("The greatest common divisor is {0}",m); //最大公因数与最小公倍数的关系:两数乘积==最大公因数*最小公倍数。 Console.WriteLine("The least common multiple is {0}",a*b/m); //更相减损术 /*概述:第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。 第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等(两数 * 相等)为止。 则第一步中约掉的若干个2与第二步中等数(最终两数相等时的值)的乘积就是所求的最大公约数。*/ int ans = 1;//储存第一步中约掉的若干个2 int result = 0;//最终结果 if (a%2==0&&b%2==0) { while (a%2==0&&b%2==0) { a /= 2; b /= 2; ans *= 2; } } while (a!=b) { if (a > b) { a -= b; } else b -= a; } result = a * ans;//第一步中约掉的若干个2与第二步中等数(最终两数相等时的值)的乘积就是所求的最大公约数。 Console.WriteLine("The greatest common divisor is {0}", result); //最大公因数与最小公倍数的关系:两数乘积==最大公因数*最小公倍数。 Console.WriteLine("The least common multiple is {0}", a * b / result); } }
三、求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时 共有5个数相加),几个数相加有键盘控制。
static void Main(string[] args) { /*题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加), 几个数相加有键盘控制。*/ string str1 = Console.ReadLine(); string str2 = Console.ReadLine(); int count = 1; int Tn = 0; int s = 0; int a = Convert.ToInt32(str1); int n = Convert.ToInt32(str2); while (count<=n) { Tn += a; s += Tn;//2+22+222+... a *= 10; count++;//最后数字个数即为循环次数 } Console.WriteLine("a+aa+aaa+...={0}",s); }
四、有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
static void Main(string[] args) { /*题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?*/ int i, j, k; int count = 0; for (i = 1; i <=4; i++) { for (j = 1; j <=4; j++) { for (k = 1; k <=4; k++) { if (i!=j&&j!=k&&i!=k) { Console.WriteLine("{0},{1},{2}",i,j,k); Console.WriteLine("The number is{0}{1}{2}",i,j,k ); count++; } } } } Console.WriteLine("The total is{0}.",count); }
五、输出9*9口诀。
static void Main(string[] args) { /*题目:输出9*9口诀。*/ int i = 1; int j = 1; //方案一: for (i = 1; i <=9; i++) { for (j = 1; j <=9; j++) { if (j <= i) { Console.Write("{0}*{1}={2}", i, j, i * j); Console.Write(" "); } else break; } Console.WriteLine();//换行 } //方案二:对方案一的简化 for (i = 1; i <= 9; i++)//控制行数 { for (j = 1; j <= i; j++) //控制列数 { Console.Write("{0}*{1}={2}", i, j, i * j); Console.Write(" "); } Console.WriteLine();//换行 } }