学习程序有一些经典的求解算法我们必须得掌握,

#include<stdio.h>
#include<math.h>
int main()
{
    int a,b,k,s;
    while(~scanf("%d%d%d",&a,&b,&k),a||b)
    {
        s=1;
        while(k--)
            s*=10;
        //printf("%dn",s);
        if (a%s==b%s) 
            printf("-1n");
        else
            printf("%dn", a+b);
    }
    return 0;
}

/*请编写程序, 该程序的功能是:对于一维整型数组,输入数组元素,
并删去数组中所有相同的数,
使各个元素均不相同。
思路:把数组中元素按顺序排列(如从小到大),然后进行操作。*/
#include<iostream>
#define num 6
using namespace std;

像本例——求两个非0自然数的最大公约数——是学习C语言时必要理解的。

  

void sort(int a[],int n);
int fun(int a[],int n); 
int main()
{
 int i,n,a[num];
 for(i=0;i<num;i++)
  cin>>a[i];
 cout<<endl<<“************”<<endl;
 sort(a,num);      //排列数组
 for(i=0;i<num;i++)
  cout<<a[i]<<” “;     //输出排列后的数组
 cout<<endl<<“************”<<endl;
 n=fun(a,num);   //筛选不同元素,并把元素个数赋给n

为解决它,通常的函数编写是这样的:

 

 for(i=0;i<n;i++)
  cout<<a[i]<<” “;   //输出筛选后的元素
 return 0;
}
//下面的函数把数组从小到大排列
void sort(int *a,int n)
{
 int i,j,tmp;
 for(i=0;i<n-1;i++)
  for(j=0;j+1<n-i;j++)
   if(a[j]>a[j+1])
   {
    tmp=a[j];
    a[j]=a[j+1];
    a[j+1]=tmp;
   }
    

int fun(int a,int b)
{
 int tmp;
 if(a<b)
 {
  tmp=a;
  a=b;
  b=tmp;
 }
 while(b!=0)
 {
  tmp=a;
  a=b;
  b=tmp%b;
 }
 return a;

 

}
//下面的函数选出各个不同的元素,并返回整理后的数组元素个数
int fun(int *a,int n)
{
 int temp,i,j=0;
 temp=a[0];
 for(i=1;i<n;i++)  
 {
  if(a[i]==temp)
   continue;
  else a[++j]=a[i];
  temp=a[i];

}

 

 }
 return j+1;

这里给出一个解决上述问题的递归函数——

 

}

int fun(int a,int b)
{
 int temp;
 if(a<b)
 {
  temp=a;
  a=b;
  b=temp;
 }
 if(b==0) return a;
 else return fun(b,a%b);
}

 

(我学的是C,这几天读了一些有关C++的知识,发现用他写程序要简便一些,所以就以C++写了这段代码

显然,第二个短小而更加有吸引力。

下面都是wa

希望对路人有帮助图片 1

 

 

 

 

 

 

#include<stdio.h>
#define min(a,b) a<=b?a:b
//返回数的位数,并拆分
int fun(int num,int temp[])
{
int i=0;
while(num)
{
temp[i++]=num%10;
num/=10;
}
return i;
}
int main()
{
int a,b,k;int c[8],d[8];int i,j;
while(~scanf(“%d%d%d”,&a,&b,&k),a||b)
{
int len1=fun(a,c),len2=fun(b,d);
int len=min(len1,len2);
if(k>len)
{
for(i=0,j=0;i<len&&j<len;i++,j++)
if(c[i]!=d[j])
{

printf(“%dn”,a+b);
break;
}
if(i==len||j==len)//不加上,会输出两个结果
printf(“-1n”);
}
else if(k=len1&&k==len2)
{
for(i=0,j=0;i<k&&j<k;i++,j++)
if(c[i]!=d[j])
{

printf(“%dn”,a+b);
break;
}
if(i==k||j==k)//不加上,会输出两个结果
printf(“-1n”);
}

else
for(i=0,j=0;i<k&&j<k;i++,j++)
if(c[i]!=d[j])
{
printf(“%dn”,a+b);
break;
}
if(i==k||j==k)//不加上,会输出两个结果
printf(“-1n”);
}
return 0;
}
//程序wa啦,应为108 8 2,看做满足条件

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define min(a,b) a<b?a:b
int main()
{
char a[6],b[6],*c,*d;
int k;int len1,len2,len;int num1,num2;int i,j;
while(~scanf(“%s %s %d”,a,b,&k))
{
if(a[0]==’0’&&b[0]==’0′)//TMD,字符0,否则停止
break;
len1=strlen(a);
len2=strlen(b);
c=(char *)malloc(len1);
d=(char *)malloc(len2);
memcpy(c,a,len1);
memcpy(d,b,len2);
len=min(len1,len2);
sscanf(c,”%d”,num1);
sscanf(d,”%d”,num2);
if(k>len)
printf(“%dn”,num1+num2);
else
for(i=len1-1;i>=len1-k;i–)
//差点搞错,应该是i=k-1;再自减,一调试,发现停止工作,引用了未初始化内存,自认为是sscanf

//原来错啦,应该是if(a[0]==0&&b[0]==0)有问题,0应该是字符0
//应该先用memcpy把初始化的内存复制一下,还要动态内存分配
//况且,逻辑有问题,每个字符数组的最后开始
for(j=len2-1;j>=len2-k;j–)
if(a[i]!=b[i])
printf(“%dn”,num1+num2);
if(i=k)
printf(“-1n”);
}
return 0;
}

//刚知道sscanf也有memcpy的功能,sscanf(a,”5s”,b),复制前五个字节到b

 

 

 

 

#include<stdio.h>
#include<string.h>
#include<malloc.h>
//#define min(a,b) a<b?a:b
int min(int a,int b)
{
return a<b?a:b;
}//换成函数后还是停止,看来不是define问题
int main()
{
char a[6],b[6];
int k;int len1,len2,len;int num1,num2;int i,j;
while(~scanf(“%s %s %d”,a,b,&k))
{
if(a[0]==’0’&&b[0]==’0′)//TMD,字符0,否则停止
break;
len1=strlen(a);
len2=strlen(b);
//c=(char *)malloc(len1);
//d=(char *)malloc(len2);
// memcpy(c,a,len1);
// memcpy(d,b,len2);
len=min(len1,len2);
sscanf(a,”%d”,num1);
sscanf(b,”%d”,num2);
if(k>len)
printf(“%dn”,num1+num2);
else
for(i=len1-1,j=len2-1;(i>=len1-k)&&(j>=len2-k);i–,j–)
//差点搞错,应该是i=k-1;再自减,一调试,发现停止工作,引用了未初始化内存,自认为是sscanf

//原来错啦,应该是if(a[0]==0&&b[0]==0)有问题,0应该是字符0
//应该先用memcpy把初始化的内存复制一下,还要动态内存分配
//况且,逻辑有问题,每个字符数组的最后开始,应该写在一个for循环内
if(a[i]!=b[j])
printf(“%dn”,num1+num2);
if(i=k)
printf(“-1n”);
}
return 0;
}

//刚知道sscanf也有memcpy的功能,sscanf(a,”5s”,b),复制前五个字节到b