常见编程算法实例关于数字上的一些编程算法1. 输出9*9口诀乘法表分析:分行与列考虑,共9行9列,i控制行,j控制列。
#include "stdio.h"main(){ int i,j,result;printf("\n");for (i=1;i<10;i++){ for(j=1;j<=i;j++){ result=i*j;printf("%d*%d=%-3d",i,j,result);/*-3d表示左对齐,占3位*/} printf("\n");/*每一行后换行*/}}2. 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。
例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
【分析】关键是计算出每一项的值。
main(){ int a,n,count=1;long int sn=0,tn=0;printf("please input a and n\n");scanf("%d,%d",&a,&n);printf("a=%d,n=%d\n",a,n);while(count<=n){ tn=tn+a;sn=sn+tn;a=a*10;++count;}printf("a+aa+...=%ld\n",sn); }公式∏/4=1-1/3+1/5-1/7+...+ 1/n ,求∏的近似值,直到最后一项1/n 的绝对值小于0.000001。
#include<stdio.h>#include<math.h>main(){ int f=1;double pi=0,t=1,v=1;while(fabs(t)>1e-6){ pi=pi+t;v+=2;f=-f;t=f/v;}pi*=4;printf("∏=%f\n",pi); }有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
规律:分子是前一项分子分母之和,分母是前一项的分子。
main(){ int n,t,number=20;float a=2,b=1,s=0;for(n=1;n<=number;n++){s=s+a/b;t=a;a=a+b;b=t;/*序列规律的实现*/}printf("sum is %9.6f\n",s); }判断11<=x<=10000中的数那些是回文数,统计回文数个数,回文数每行输出10个。
分析:(1) 让x重新构成新的数t,如果x==t则是回文数.(2) 分解出x的各位,进行首尾比较,如果都相等则是回文数。
fun1()//算法一{ long x,i,t=0,s=10,cnt=0;for(x=11;x<10000;x++){ i=x;while(i!=0)//构成新的数{ t=t*s+i%10;i=i/10; }if(t==x){printf("%5d",x);cnt++;if(cnt%10==0)printf("\n"); }t=0; }printf("\ncnt=%5d",cnt);}fun2()//算法二{ long x,i,t=0,j=0,s=10,x1,cnt=0;int a[10];for(x=11;x<10000;x++){ x1=x;while(x1!=0)//分解出各位{ a[ j ]=x1%10;x1=x1/10;j++; }i=0;j--;while(i<j)//首尾比较if(a[i]==a[j])i++,j--;else break;if(i>=j){printf("%5d",x);cnt++;if(cnt%10==0)printf("\n"); }j=0; }printf("\ncnt=%5d",cnt); }main(){fun1(); }求1+2!+3!+...+20!的和。
main(){float n,s=0,t=1;for(n=1;n<=20;n++){ t*=n; //实现阶乘s+=t; //将阶乘累加}printf("1+2!+3!...+20!=%e\n",s); //%e 为科学计数法输出}输入一个年份判断它是否是闰年,满足下面条件之一就称为闰年:(1).能被4整除而不能被100整除。
(2).能被100整除也能被400整除。
#include<stdio.h>main(){long int year;printf("input year:");scanf("%d",&year);if(year%4==0&& year%100!=0||year%100==0&&year%400==0)printf("yes");else printf("No"); }将十进制数转换成任意进制。
分析:将输入的数循环除以基数取余直到商为0 ,然后逆序输出。
#include<stdio.h>void main() // idec为十进制数,ibase为要转换成数的基{int idec,i, idr, p=0,ibase;char strdr[20],t;printf("输入要转换的十进制数idec=");scanf("%d",&idec);printf("\n输入要转换成的进制基数(如:八进制则输入8)ibase=");scanf("%d",&ibase);while(idec!=0) //循环除以基数取余直到商为0{ idr=idec % ibase;if(idr>=10)strdr[p++]=idr-10+65; //将16进制的10,11,12,13,14,15与A,B,C,D,E,F对应else strdr[p++]=idr+48; //将数字转换为数字字符idec/=ibase; //得到商,把这个商的值重新赋值给idec} //下面for循环的目的是将取余的各数逆序存放,for(i=0; i<p/2; i++){ t=strdr[i];strdr[i]=strdr[p-i-1];strdr[p-i-1]=t; }strdr[p]='\0';printf("\n转换成%d进制后的数为:%s",ibase,strdr);printf("\n"); }将一个数组逆序输出。
分析:用第一个与最后一个交换,然后用第二个与倒数第二个交换,其余依此类推。
#define N 5main(){int a[N]={9,6,5,4,1},i,temp;printf("\n original array:\n");for(i=0;i<N;i++)printf("%4d",a[i]);for(i=0;i<N/2;i++){temp=a[i];a[i]=a[N-i-1];a[N-i-1]=temp; }printf("\n sorted array:\n");for(i=0;i<N;i++)printf("%4d",a[i]); }打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。
例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
main(){int i,j,k,n;printf("'water flower'number is:");for(n=100;n<1000;n++){ i=n/100;/*分解出百位*/j=n/10%10;/*分解出十位*/k=n%10;/*分解出个位*/if(i*100+j*10+k==i*i*i+j*j*j+k*k*k){ printf("%-5d",n);} }printf("\n"); }找出3-1000中的全部素数。
素数(质数):只能被1和自身整除的自然数(1除外).如 2 3 5 7是素数。
#include<stdio.h>#include<math.h>main(){int i,j,cnt=0;for(i=3;i<=1000;i++){ for(j=2;j<=sqrt(i);j++)//i能被j整除说明不是素数,数学上已经证明只需要判断{ if(i%j==0) break; } // j<=sqrt(i),i都不能被j整除就能证明i为素数。
if(j>sqrt(i)){ printf("%4d",i);cnt++;if(cnt%5==0)printf("\n"); //控制每行输出5个数} } }判断整数x(0<x<100)是否是同构数。
同构数:一个数它出现在它的平方数的右边例如: 5 ,5的平方数是25,5是25中右侧的数,所以5是同构数;又如25 是625的同构数.#include<stdio.h>main(){ long int x,y,i=10;int flag=0;for(x=1;x<100;x++){y=x*x;while(y/i!=0) //利用循环取余的方法进行判断{ //先让y对10取余,判断是否是同构数if(y%i==x) //再对100取余判断,直到y/i为0{ flag=1;break; }i=i*10; }if(flag==1) printf("\n%d是%d的同构数!",x,y);flag=0;i=10; } }一个数如果恰好等于它的因子之和,这个数就称为"完数"。
例如6=1+2+3。
编程找出1000以内的所有完数。
main(){ static int k[11];int i,j,n,s;for(j=2;j<1000;j++){ n=-1;s=j;for(i=1;i<j;i++){if((j%i)==0){n++;//找到质因子s=s-i;//减去找到的因子,如果减到s=0说明s是完数k[n]=i;} }if(s==0){printf("%d is a wanshu",j);for(i=0;i<n;i++)printf("%d,",k[i]);printf("%d\n",k[n]);}}}弦数:一个正整数x其平方等于某两个正整数平方之和。