辗转相除法求最大公约数和最小公倍数 1:/*辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。 2:例如,252和105的最大公约数是21(252=21×12;105=21×5); 3:因为252?105=147,所以147和105的最大公约数也是21。在这个过程中,较大的数缩 4:小了,所以继续进行同样的计算可以不断缩小这两个数直至其中一个变成零。这时,所剩下的 5:还没有变成零的数就是两数的最大公约数。 6:*/ 7:#include 8: 9:intgetGCDAndLCM(inta,intb){ 10: intmax=a>b?a:b;//将较大的数赋给max 11: intmin=(max=a)?b:a;//将较小的数赋给min 12: inttemp;//暂时存储变量 13: while(max!=0){ 14: temp=min%max; 15: min=max; 16: max=temp; 17: } 18: printf("最大公约数为%d\n",min); 19: printf("最小公倍数为%d\n",a*b/min); 20:}
21: 22:intmain(){ 23: printf("输入两个数整数值\n"); 24: inta,b; 25: scanf("%d",&a); 26: scanf("%d",&b); 27: getGCDAndLCM(a,b); 28: return0;29:}C语言水仙花数算法打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。 2.程序源代码: main() { inti,j,k,n; printf("'waterflower'numberis:"); for(n=100;n挖经验>题库中心>C/C++语言程序百例>100.数字移动 100.数字移动作者:不详 来源:互联网 酷勤网收集 2008-04-25 摘要 酷勤网 在图中的九个点上,空出中间的点,其余的点上任意填入数字1到8;1的位置固定不动,然后移动其余的数字,使1到8顺时针从小到大排列.移动的规律是:只能将数字沿线移向空白的点.请编程显示数字移动过程。思考题:编写更优化的程序,尽可能减少移动的步数。 在图中的九个点上,空出中间的点,其余的点上任意填入数字1到8;1的位置固定不动,然后移动其余的数字,使1到8顺时针从小到大排列.移动的规律是:只能将数字沿线移向空白的点. 请编程显示数字移动过程。 *问题分析与算法设计 分析题目中的条件,要求利用中间的空白格将数字顺时针方向排列,且排列过程中只能借空白的点来移动数字.问题的实质就是将矩阵外面的8个格看成一个环,8个数字在环内进行排序,同于受题目要求的限制"只能将数字沿线移向空白的点",所以要利用中间的空格进行排序,这样要求的排序算法与众不同.
观察中间的点,它是唯一一个与其它8个点有连线的点,即它是中心点.中心点的活动的空间最大,它可以向8个方向移动,充分利用中心点这个特性是算法设计成功与否的关键. 在找到1所在的位置后,其余各个数字的正确位置就是固定的.我们可以按照下列算法从数字2开始,一个一个地来调整各个数字的位置. *确定数字i应处的位置; *从数字i应处的位置开始,向后查找数字i现在的位置; *若数字i现在位置不正确,则将数字i从现在的位置(沿连线)移向中间的空格,而将原有位置空出;依次将现有空格前的所有元素向后移动;直到将i应处的位置空出,把它移入再次空出中间的格. 从数字2开始使用以上过程,就可以完成全部数字的移动排序. 编程时要将矩阵的外边八个格看成一个环,且环的首元素是不定的,如果算法设计得不好,程序中就要花很多精力来处理环中元素的前后顺序问题.将题目中的3X3矩阵用一个一维数组表示,中间的元素(第四号)刚好为空格,设计另一个指针数组,专门记录指针外八个格构成环时的连接关系.指针数组的每个元素依次记录环中数字在原来数组中对应的元素下标.这样通过指针数组将原来矩阵中复杂的环型关系表示成了简单的线性关系,从而大大地简化了程序设计. *程序说明与注释 #include inta[]={0,1,2,5,8,7,6,3};/*指针数组.依次存入矩阵中构成环的元素下标*/ intb[9];/*表示3X3矩阵,b[4]为空格*/ intc[9];/*确定1所在的位置后,对环进行调整的指针数组*/ intcount=0;/*数字移动步数计数器*/