一、数字分解与合并
1、整数的分解与合并
int i,j,k =5402;
int a[6];
int x=k; //把k传给x,保证了k值不被修改。
for(i=0;x>0;i++){
a[i]=x%10;
x/=10;
}
for(j=i-10;j>=0;j--)
printf("%d ",a[j]);
printf("\n");
for(j=i-1,k=0;j>=0;j--){
k*=10;
k+=a[j];
}
printf("k=%d\n",k);
2、实数的小数部分分解与合并
double f=9403.7023;
int i,j, k=(int)f;
int a[10] = {0};
double d=f-k; //获得小数部分:先取整, 再用原来的数-整数 = 小数
for(i=0;d>fabs(10e-5);i++){ // d>fabs(10e-5):代表d的精度0.000000
d*=10;
a[i] = (int)d; //取得整数
d -= a[i]; //减去整数,这里i多加了一个,所以j=i-1,而不是直接 j=i
}
for(j=0;j<i;j++)
printf("%d ",a[j]);
printf("\n");
for(j=i-1,d=0;j>=0;j--){
d/=10;
d+=a[j];
}
printf("%0.6lf\n",d/10);
二、数制转换
char ch[17]="0123456789ABCDEF";
char a[64];
int n,m,i,j;
scanf("%d%d",&n,&m);
for(i=0;n!=0;i++){
a[i] = ch[n%m];
n /= m;
}
a[i]='\0';
for(j=i-1;j>=0;j--)
printf("%c",a[j]); //按照原来的顺序输出: 从高-->低
printf("\n");
三、括号匹配
char c,a[10];
int i=0;
c=getchar();
while(c!='\n'){
if(c=='(')
a[i++]=c;
else if(c==')'){
i--;
if(i<=-1)
break;
}
c=getchar();
}
if(i!=0)
printf("括号匹配失败!\n");
else
printf("括号匹配成功!\n");
四、回文串
//方法1(for循环):
char ch[20]="abcba";
int i,j;
for(i=0,j=strlen(ch)-1;i<j;i++,j--) //j:指向最后一位 i:指向第一位 i++,j-- 向中间靠拢
{
if(ch[i]!=ch[j])
break;
}
if(i<j)
printf("不是回文串!\n");
else
printf("是回文串!\n");
//方法2(递归):
int fun(char *ch,int len,int index=0){ //这里用了C++的特性默认参数
--len; //在调用时如果len已经-1那这句就去掉是
if(index>len)return 1;
if(ch[index]!=ch[len])
return 0;
else
return fun(ch,len-1,index+1);
}
五、首尾交换
int k;
int i,j;
char a[20],t;
gets(a);
for(i=0,j=strlen(a)-1 ; i<j ; i++,j--){
t=a[i];
a[i]=a[j];
a[j]=t;
}
printf("%s\n",a);
for(k=0; k<(int)strlen(a); k++)
{
printf("%c",a[k]);
}
六、二分查找
//方法1(while循环):
int low=0,hig=8,mid,key=3;
int a[]={1,2,3,4,5,6,7,8,9};//前提是a[]已经从 小-->大 排序
while(low<hig){
mid=(low+hig)/2;
if(a[mid]>key)
hig=mid-1;
else if(a[mid]<key)
low=mid+1;
else
printf("a[%d]=%d \n",mid,a[mid]);
}
//方法2(递归):
int fun(int *a,int key,int hig,int low=0){ //返回元素的下标
int mid = (low+hig)/2;
if(low > hig)
return 0;
if(a[mid] == key)
return mid;
else if(a[mid] < key)
return fun(a,key,hig,mid+1);
else if(a[mid] > key)
return fun(a,key,mid-1,low);
}
void main(){
int a = 123456789;
fun(a,3,strlen(sizeof(a)),0);
}
???? 七、最大公约数
int fun()
{
int i,m=28,n=12;
for(i=(m>n?n:m);i>0;i-=(m>n?n:m))
if((m>n?m:n)%i==0)
break;
return i;
}
void main()
{
printf("i=%d\n",fun());
}
八、最小公倍数s
int fun()
{
int i,m=28,n=12;
for(i=(m>n?m:n);i<m*n;i+=(m>n?m:n))
if(i%(m>n?n:m)==0)
break;
return i;
}
void main()
{
printf("i=%d\n",fun());
}
九、欧几里德算法
while(r = m%n){
m=n;
n=r;
}
算法:
1、求余数:以n除m,并令r为所得余数(0<=r<=n)。
2、余数为0否?:若r=0算法结束,n即为答案。
3、减小:置m=n,n=r;并返回到步骤1.
证明:
{m,n}{n,r}
a.在步骤1后,对某个整数q, 我们有m=qn+r;
b.如果r=0;则m是n的倍数;n是m和n的最大因子;
c.如果r!=0;注意整除m和n的任何数必定整除m-qn=r;
d.因此整除n和r的任何数也必定整除qn+r=m;
e.所以{m,n}的公因子集合和{n,r}的公因子集合是一样的;
f.特别地,它们的最大因子是一样的。
求对大公约数的递归算法:
int fun(int n,int m){
//保证 m>n 成立
if(m<n){
int temp = m;
m=n;
n=temp;
}
//int r=(m>n?m:n)%(m>n?n:m);
int r=m%n;
if(r==0)
return n;
else
return fun(r,n);
}
void main()
{
printf("%d\n",fun(24,6));
}
十、百马驮百货:有100只马和100担货,大马驮3担,中马驮2担,小马驮1担,问100只马驮完100担货,大马、中马、小马各驮几只?
void main(){
int i,j,k;
for(i=0;i<33;i++)
for(j=0;j<55;j++)
if(i*3+j*2+100-i-j==100)
printf("i=%d,j=%d,k=%d\n",i,j,100-i-j);
}
十一、百元买百鸡,100块钱买100只鸡。母鸡5块钱1只,公鸡3块钱1只,小鸡1块钱3只。
for(int i=0;i<20;i++)
for(int j=0;j<33;j++)
if(i*5+j*3+(double)(100-i-j)/3==100.0)
printf("母鸡%d只,公鸡%d只,小鸡%d只\n",i,j,100-i-j);
十二、最小自然数:产生一个个位为6的整数(i=16,我们这里使用试探法,所以会有一个if() 然后break; ),并且这个数的个移到其余位之前,使得这个数是原来个位为6的整数的4倍。
void main()
{
//printf("hello word!\n");
long int i,n;
int m;
for(i=16; ;i+=10){
n=i;//用n来替代i的值,保证i值不变。
m=6;
while(n>=10){
m *= 10;
n /= 10; //n:除个位数之外的整数
}
if((m+i/10)==(4*i)){
printf("%d\n",i);
break;
}
}
}
十三、组合:n个球中取m个球,有几种取法?
/*
n个球中取m个球,的组合?C(n,m)=C(n-1,m)+C(n-1,m-1)
*/
int fun(int n,int m){
if(n==0||m==0)
return 0;
if(n==0||m==0) return 1;
if(m==n) return 1;
else{
return fun(n-1,m) + fun(n-1,m-1);
}
}
void main()
{
printf("%d\n",fun(12,8));
}
十四、把相邻重复的字符去掉
void main()
{
char *p="aaabbbcccdddeeefff";
char buff[100];
char *q = p; //指针q指向p的首地址
int i=0;
puts(p);
while(*q){
if(p==q || *q != *(q-1))
buff[i++] = *q;
q++;
}
//上面多加了一个i
buff[i]='\0'; //在末尾加上'\0'
puts(buff);
}
十五、输出数组中第m大的数,数组各个元素互不相等。
#include <stdio.h>
int main(){
int i,j,k,m,n,a[]={9,8,7,6,5,4,3,2,1,0},b[10]={0};
scanf("%d",&m);
n=sizeof(a)/sizeof(int);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(i!=j && a[i]<a[j])
b[i]++;
}
if(b[i]==m-1)
k=i;
}
printf("a[%d]=%d\n",k,a[k]);
return 0;
}