几个C语言小练习

有一个正整数N,N可以分解成若干个正整数之和,问如何分解能使这些数的乘积最大。请编程,由键盘输入一个正整数N(N<100),将N分解成若干个正整数,输出这些数的乘积M,且要保证M是最大的。

我们要编写一个函数,这个函数把一个数分为两个数之和,并且这两个数的乘积最大,这样的函数是不是很好编写,代码如下:
void f1(int a, int *x,int *y){
*x=a/2;
*y=a-*x;
}
知道为什么这样分吗,原理很简单:两个数都最大的时候,乘积才最大。也就是各取一半,如果a是奇数就让y多1。

要完成把N分为多个数,使其乘积最大,我们就先分为两个数,然后分别对这两个数进行各自进行拆分(递归调用),直到分开的两个数乘积比分前小,那就取消这次拆分。

基于以上说明,我们对f1函数进行修改,增加递归调用部分:
void f1(int n){
int x,y;
x=n/2;
y=n-x;
if (n>=x*y) printf("%d ",n);
else {f1(x);f1(y);}
}

添加计算乘积m的代码,以及主程序,完成的如下:

-----------------
int m;

void f1(int n){
int x,y;
x=n/2;
y=n-x;
if (n>=x*y) {printf("%d ",n);m*=n;}
else {f1(x);f1(y);}
}

main(){
int n;
m=1;
scanf("%d",&n);
f1(n);
printf("\n%d",m);
}
-----------------
程序在SCO UNIX上运行通过,结果如下:
-----------------
$ cc a.c
$ a.out
9
4 2 3
24
$ a.out
10
2 3 2 3
36
$ a.out
12
3 3 3 3
81
$
-----------------

求神秘数


取任何一个4位数(4个数字均为同一个数字的例外),将组
成该数的4个数字重新组合成可能的最大数和可能的最小数,再将两者的
差求出来;对此差值重复同样的过程(例如:开始时取数8028,最大的
重新组合数为8820,最小的为0288,二者的差8532。重复上述过程得
出8532-2358=6174),最后总是达到一个神秘的数,请编程求出这
个神秘的数。

#include<stdio.h>
int sm(int);
void main()
{
int a,s;
printf("输入各个位数不完全相等的四位数a:\n");
scanf("%d",&a);
s=sm(a) ;
printf("神秘数是\n%d\n",s);
}
int sm(int a)
{
int b,c,d,e;
int b2,c2;
    b=a%10;b2=a/10;
    c=b2%10;c2=b2/10;
    d=c2%10;
    e=c2/10;
    int f[4]={e,d,c,b};
for(int j=0;j<3 ;j++)
for(int i=0;i<3-j;i++)
if(f[i]<f[i+1])
{
int t=f[i];
f[i]=f[i+1];
f[i+1]=t;

}
int max=f[0]*1000+f[1]*100+f[2]*10+f[3];
int min=f[3]*1000+f[2]*100+f[1]*10+f[0];
int s=max-min;
if(s==a) return a;
a=s;
return sm(a) ;
}

求回文数


一个数如果从左往右读和从右往左读数字是相同的,则称这个
数为回文数,比如898,1221等等。求既是回文数又是质数的五位十进制
数有多少个?



#include<stdio.h>
#include<math.h>

int IsOfTwo (int x)                      //质数
{
int flag=1;
    int i;
for(i=2;i<=( (int) sqrt ( x )+1 ); i++)
{
if((x%i)==0)
{
flag=0;
break;
}
}
return(flag);
}
int IsOfOne(int x)                       //回文数
{
int flag=0;
if((x%10)==(x/10000))
    if(((x%100)/10)==((x%10000)/1000))
flag=1;
return(flag);
}

main()
{
int num;
    int counter=0;
for(num=10000;num<=99999;num++)
    {
if(IsOfTwo(num)&&IsOfOne(num))
{
counter++;
}
}
    printf("%d\n",counter);
}

求ABC

A、C都是一个4位完全平方数;B是一个4位数,且每一位的数
字都相同。已知C=A-B,请编程求出所有这样的A、B、C组合。


#include<stdio.h>

int flag(int x)
{

int flag=0;

if((x>=1000)&&(x<10000))
{
if((x/1000)==(x%10))
if((x/1000)==((x%1000)/100))
   if((x/1000)==((x%100)/10))
flag=1;
}
return(flag);
}


void main()
{
int outer;
int inner;
printf("A     B     C\n");
for(outer=32;outer<=100;outer++)
{
for(inner=32;inner<outer;inner++)
{
if(flag(outer*outer-inner*inner))
{
printf("%-5d%-5d%-5d\n",outer*outer,inner*inner,outer*outer-inner*inner);
}
}
}
}

将英语单词变成负数

请编写一个程序,可以将英语规则名词单数变成复数。已知规
则(不全)如下:
a) 以辅音字母y结尾,则将y改成i,再加es;
b) 以s,x,ch,sh结尾,则加es;
c) 以元音o结尾,则加es;
d) 其他情况直接加s;
要求用键盘输入英语规则名词(假定用户输入的正确的单词),输出该名
词的复数形式。
例如:
输入:book
输出:books




#include<stdio.h>
void main()
{
int outer;
char x;
char word [25];
scanf("%s",word);
    for(outer=0;outer<=25;outer++)
{
if(word[outer]=='\0')   break;
x=word[outer];
}
switch(x)
{
case('y'):
{
word[outer-1]='i';
word[outer]='e';
word[outer+1]='s';
word[outer+2]='\0';
break;
}
case('s'):
{
word[outer]='e';
word[outer+1]='s';
word[outer+2]='\0';
break;
}
case('x'):
{
word[outer]='e';
word[outer+1]='s';
word[outer+2]='\0';
break;
}
case('o'):
{
word[outer]='e';
word[outer+1]='s';
word[outer+2]='\0';
break;
}
case('h'):
{
if((word[outer-2]=='c')||(word[outer-2]=='s'))
{
word[outer]='e';
   word[outer+1]='s';
   word[outer+2]='\0';
   break;
}
}
default:
{
word[outer]='s';
word[outer+1]='\0';
}
}
printf("%s\n",word);
}

统计类别的个数

C语言编程

输入一串字符,统计这串字符中的0~9的数字分别有几个,字母有几个,其他字符有几个。

#include<stdio.h>
#include<string.h>
void main()
{
char b[20];
int a[10],i,m=0,n=0;
for(i=0;i<10;i++)                             //chu shi hua 
a[i]=0;
printf("Enter a character:\n");
scanf("%s",b);
for(i=0;i<(int)strlen(b);i++)                    
{
if('0'<=b[i]&&b[i]<='9')             //0 dao 9
{
int t;t=b[i]-'0';a[t]++;          

}
else
if('a'<=b[i]&&b[i]<='z'||'A'<=b[i]&&b[i]<='Z')           
m++;
else
n++;
}
for(i=0;i<10;i++)
         printf("%d出现的次数%5d\n",i,a[i]);
printf("字母的个数%d\n",m);
printf("其他字符的个数%d\n",n);
}



Quote Of The Day