#include
int main(int argc,char** argv)
{
int cm;
scanf("%d",&cm);
float x=cm/0.3048/100;
float a=(x-(int)x)*12.0;
int b=(int)x;
printf("%d %d\n",b,(int)a);
return 0;
}
>>注意把厘米换成米
7-2
#include
int main(int argc,char** argv)
{
int a,b;
scanf("%d%d",&a,&b);
int hour1,hour2,min1,min2;
hour1=a/100,hour2=b/60;
min1=a%100,min2=b%60;
int hour=hour1+hour2;
int min=min1+min2;
if(min>=60)
hour++,min-=60;
if(min<0)
hour--,min+=60;
printf("%d%02d\n",hour,min);
return 0;
}
>>小坑,输出格式里说“输出四位数字表示的终止时间”,其实小时是个位时前面不用加0。
7-3
#include
int main(int argc,char** argv)
{
int num;
scanf("%d",&num);
while(!(num%10))
num/=10;
while(num)
{
printf("%d",num%10);
num/=10;
}
printf("\n");
return 0;
}
7-4
#include
int main(int argc,char** argv)
{
int num;
scanf("%d",&num);
int cnt=0,i=1;
while(num)
{
cnt+=i*(num%16);
i*=10;
num/=16;
}
printf("%d\n",cnt);
return 0;
}
>>题目翻译一下就是十进制转换成十六进制
7-5
#include
int main(int argc,char** argv)
{
printf("------------------------------------\n"
"Province Area(km2) Pop.(10K)\n"
"------------------------------------\n"
"Anhui 139600.00 6461.00\n"
"Beijing 16410.54 1180.70\n"
"Chongqing 82400.00 3144.23\n"
"Shanghai 6340.50 1360.26\n"
"Zhejiang 101800.00 4894.00\n"
"------------------------------------\n");
return 0;
}
7-6
#include
int main(int argc,char** argv)
{
int num;
char ch;
float f1,f2;
scanf("%f %d %c %f",&f1,&num,&ch,&f2);
printf("%c %d %.2f %.2f",ch,num,f1,f2);
return 0;
}
7-7
#include
int main(int argc,char** argv)
{
int hour,min;
scanf("%d:%d",&hour,&min);
if(hour<12)
printf("%d:%d AM\n",hour,min);
else if(hour==12)
printf("12:%d PM\n",min);
else
printf("%d:%d PM\n",hour-12,min);
return 0;
}
7-8
#include
int main(int argc,char** argv)
{
int speed;
scanf("%d",&speed);
if(speed>60)
printf("Speed: %d - Speeding\n",speed);
else
printf("Speed: %d - OK\n",speed);
return 0;
}
7-9
#include
int main(int argc,char** argv)
{
int A,B,C;
scanf("%d %d %d",&A,&B,&C);
if(A==B)
printf("C\n");
else if(B==C)
printf("A\n");
else
printf("B\n");
return 0;
}
7-10
#include
int main(int argc,char** argv)
{
int year,week;
scanf("%d %d",&year,&week);
int k=year<5?30:50;
float sum=k*(week>40?40:week);
sum+=(week>40?(week-40)*1.5*k:0);
printf("%.2f\n",sum);
return 0;
}
7-11
#include
int main(int argc,char** argv)
{
float x;
scanf("%f",&x);
float y=(x<=15?x*4/3:2.5*x-17.5);
printf("%.2f\n",y);
return 0;
}
7-12
#include
int main(int argc,char** argv)
{
int num1,num2;
char sf;
scanf("%d %c %d",&num1,&sf,&num2);
int result;
if(sf=='+')
result=num1+num2;
else if(sf=='-')
result=num1-num2;
else if(sf=='*')
result=num1*num2;
else if(sf=='/')
result=num1/num2;
else if(sf=='%')
result=num1%num2;
else
{
printf("ERROR\n");
return 0;
}
printf("%d\n",result);
return 0;
}
7-13
#include
int main(int argc,char** argv)
{
float num1,num2,num3,num4;
scanf("%f%f%f%f",&num1,&num4,&num3,&num2);
if(num2>num1)
printf("R-Hollow");
if(num2==num1)
printf("R-Cross");
if(num2num1&&num4>num2)
printf(" and Upper Shadow");
}
else if(num4>num1&&num4>num2)
printf(" with Upper Shadow");
printf("\n");
return 0;
}
7-14
#include
int main(int argc,char** argv)
{
int a,b;
scanf("%d%d",&a,&b);
int i=1,sum=0;
while(a<=b)
{
sum+=a;
printf("%5d",a++);
if(!(i%5)&&a<=b)
printf("\n");
i++;
}
printf("\nSum = %d\n",sum);
return 0;
}
>> i 计录已输出个数,每五个输出一次回车,其余输出空格。a>b则停止输出空格或回车。
7-15
#include
int main(int argc,char** argv)
{
double x;
scanf("%lf",&x);
double i=1,tip=1,j=1,sum=0;
double a=1,tips=1;
int col=0;
while(i>=x)
{
if(col)
tip*=j++;
else
col++;
tips*=a;
a+=2;
i=tip/tips;
sum+=i;
}
printf("%.6lf\n",sum*2.0);
return 0;
}
>>小坑:题目给的公式求出来是Pi/2,最后需要乘2。给定阈值是公式里最后一项<0.01。
7-16
#include
int dig[4],book[5];
int k=0;
void func(int num,int now)
{
if(now==4)
{
int i;
for(i=1;i<=3;i++)
{
printf("%d",dig[i]);
}
k=(k+1)%6;
if(k%6)
putchar(' ');
else
putchar('\n');
return;
}
int i;
for(i=num;i<=num+3;i++)
{
if(!book[i])
{
book[i]++;
dig[now]=i;
func(num,now+1);
book[i]=0;
}
}
}
int main(int argc,char** argv)
{
int num;
scanf("%d",&num);
func(num,1);
return 0;
}
>>DFS从小到大全排列,输出时只输出前三位。
7-17
#include
int main(int argc,char** argv)
{
int N,U,D;
scanf("%d%d%d",&N,&U,&D);
int floor=0,time=0;
while(floor=N)
break;
floor-=D,time++;
}
printf("%d\n",time);
return 0;
}
>>小学数学题……
7-18
#include
int main(int argc,char** argv)
{
double a,b,c,d;
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
double x1,x2;
scanf("%lf%lf",&x1,&x2);
while(1)
{
double x=(x1+x2)/2.0;
double y=a*x*x*x+b*x*x+c*x+d;
double y1=a*x1*x1*x1+b*x1*x1+c*x1+d;
if(y==0||x2-x1<0.01)
{
printf("%.2lf\n",x);
break;
}
if(y*y1<0)
x2=x;
else
x1=x;
}
return 0;
}
>>当前区间 x2-x1 小于0.01时不再计算。
7-19
#include
int main(int argc,char** argv)
{
int N;
scanf("%d",&N);
int i;
float Y;
for(i=0;i<=99;i++)
{
Y=(98.0*i-N)/199.0;
if(!(Y-(int)Y))
break;
}
if(i==100)
printf("No Solution\n");
else
printf("%d.%d\n",(int)Y,i);
return 0;
}
>> y 元 f 分中的 f 肯定是0~99之间的,遍历一遍有没有对应的整数 y 。
7-20
#include
int main(int argc,char** argv)
{
int N;
scanf("%d",&N);
int i;
for(i=1;i<=N;i++)
{
int j;
for(j=1;j<=i;j++)
printf("%d*%d=%-4d",j,i,i*j);
printf("\n");
}
return 0;
}
7-21
#include
#include
int main(int argc,char** argv)
{
int N;
scanf("%d",&N);
int x=N/2,k=0;
double i,j;
for(i=1;i<=sqrt(x);i++)
for(j=i;j
7-22
#include
#include
int main(int argc,char** argv)
{
int N;
scanf("%d",&N);
int wugui=0,tuzi=0;
int time,xtime=0;
for(time=1;time<=N;time++)
{
if(!xtime)
tuzi+=9;
if(xtime)
xtime--;
if(time%10==0&&!xtime&&tuzi>wugui)
xtime=30;
wugui+=3;
}
if(tuzi>wugui)
printf("^_^ %d\n",tuzi);
if(tuzi
>>小学数学题……
7-23
#include
int main(int argc,char** argv)
{
int N;
scanf("%d",&N);
int fk1=0,fk2=0,fk3=0,fk4=0;
if(!N)
printf("a");
if(N/100000000)
{
putchar(N/100000000+'a');
putchar('Y');
N%=100000000;
fk3=1;
}
if(N/10000)
{
int M=N/10000;
N%=10000;
if(M/1000)
{
putchar(M/1000+'a');
putchar('Q');
M%=1000;
fk1=1;
fk3=0;
}
if(M/100)
{
if(fk3)
{
fk3=0;
putchar('a');
}
putchar(M/100+'a');
putchar('B');
M%=100;
fk1=0;
fk2=1;
}
if(M/10)
{
if(fk1||fk3)
{
fk1=fk3=0;
putchar('a');
}
putchar(M/10+'a');
putchar('S');
M%=10;
fk2=0;
}
if(M)
{
if(fk1||fk2||fk3)
{
fk3=0;
putchar('a');
}
putchar(M+'a');
}
putchar('W');
fk1=fk2=0,fk4=1;
}
if(N/1000)
{
if(fk3)
{
fk3=0;
putchar('a');
}
putchar(N/1000+'a');
putchar('Q');
N%=1000;
fk1=1;
fk4=0;
}
if(N/100)
{
if(fk3||fk4)
{
fk3=fk4=0;
putchar('a');
}
putchar(N/100+'a');
putchar('B');
N%=100;
fk1=0;
fk2=1;
}
if(N/10)
{
if(fk1||fk3||fk4)
{
fk1=fk3=fk4=0;
putchar('a');
}
fk2=0;
putchar(N/10+'a');
putchar('S');
N%=10;
}
if(N)
{
if(fk1||fk2||fk3||fk4)
putchar('a');
putchar(N+'a');
}
putchar('\n');
return 0;
}
疯狂判断法…2333。很麻烦的一道题,麻烦的地方在于零( a )在什么地方需要加。人民币大写规则转换参考这个网站,还能提供标准的输出答案。人民币大写在线转换工具
以下是关于零的几种情况:
100000001——bYab
110000001——bYbQWab
101000001——bYabBWab
11001——bWbQab
10101——bWabBab
1010001——bBabWab
0——a
全都考虑到就OK了,用笨办法从亿位到个位逐一确认是否不为0,前面高次位如果有数的话,标记一下,后面的紧挨的位也有数的话取消标记,否则就在第一个不是0的位前加零( a )。需要加以判断的标记位有
亿位——千万位取消标记,否则百万位到个位的第一个不为0的位前加a
千万位——百万位取消标记,否则十万位到万位的第一个不为0的位前加a
百万位——十万位取消标记,否则万位不为0的第的话前加a
万位——千万~万位有不为零的就标记,千位取消标记,否则百位到个位的第一个不为0的位前加a
千位——百位取消标记,否则十位到个位的第一个不为0的位前加a
百位——十位取消标记,否则个位不为0的第的话前加
方法看着很糟糕,本来以为没几个特殊条件的,就挨个判断好了,没想到这么多。直接把中间多个零当成一个零处理会简单得多…………笨办法仅供通过测试
7-24
#include
int gcd(int a,int b)
{
return a%b?gcd(b,a%b):b;
}
int main(int argc,char** argv)
{
int a,b;
scanf("%d/%d",&a,&b);
int c=gcd(a,b);
printf("%d/%d\n",a/c,b/c);
return 0;
}
>>辗转相除法求最大公因数
7-25
#include
int main(int argc,char** argv)
{
int num;
scanf("%d",&num);
if(num<0)
{
num=-num;
printf("fu ");
}
int dig[15]={0};
int i=1,j;
while(num)
{
dig[i++]=num%10;
num/=10;
}
char str[11][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
if(i==1)
printf("ling\n");
for(j=i-1;j>=1;j--)
printf("%s%c",str[dig[j]],j==1?'\n':' ');
return 0;
}
>>从最低位开始存储每一位的数字,读取完毕后从最高位的数字开始转换成对应的字符串输出。如果是负数前面加负号的字符串,如果没有进行存储则直接输出 0 对应的字符串。
7-26
#include
int main(int argc,char** argv)
{
char ch;
int chlen=0,first=0;
while(scanf("%c",&ch),ch!='.')
{
if(ch!=' ')
chlen++;
else if(chlen)
{
if(!first)
{
printf("%d",chlen);
first=1;
}
else
printf(" %d",chlen);
chlen=0;
}
}
if(chlen)
{
if(!first)
printf("%d",chlen);
else
printf(" %d",chlen);
}
return 0;
}
>>不是空格或点就计数,遇到空格或点就输出当前计数并清零。
7-27
#include
int main(int argc,char** argv)
{
int N,K;
scanf("%d%d",&N,&K);
int i,j,dig[105];
for(i=1;i<=N;i++)
scanf("%d",&dig[i]);
for(i=0;idig[j+1])
{
dig[j+1]+=dig[j];
dig[j]=dig[j+1]-dig[j];
dig[j+1]-=dig[j];
}
for(i=1;i<=N;i++)
printf("%d%c",dig[i],i==N?'\n':' ');
return 0;
}
>>标准冒泡排序,调整排序次数为 K 次。
7-28
#include
int main(int argc,char* argv[])
{
int m;
scanf("%d",&m);
int s=0;
for(int i=2;i<=m;i++)
s=(s+3)%i;
printf("%d\n",s+1);
return 0;
}
>>约瑟夫问题,可以用数组模拟的方法,也可以数学推导后递归公式求解。
详见我得另一篇文章 模拟/递归:约瑟夫问题
7-29
#include
#include
char str1[1005];
char str2[1005];
int main(int argc,char** argv)
{
scanf("%[^\n]%*c",str1);
scanf("%[^\n]%*c",str2);
char *point;
int mlen=strlen(str1);
int slen=strlen(str2);
while(point=strstr(str1,str2),point!=NULL)
{
while(point!=str1+mlen)
{
*point=*(point+slen);
point++;
}
}
printf("%s\n",str1);
return 0;
}
>>字符串函数应用,strlen求得两串长度,strstr在母串找字串,找到后从指针处到母串结尾向前移动。
7-30
#include
#include
int main(int argc,char** argv)
{
int N,K;
scanf("%d%d",&N,&K);
int i,j,book[105];
for(i=1;i<=N;i++)
book[i]=i;
char dig[105][15];
for(i=1;i<=N;i++)
scanf("%s",dig[i]);
for(i=0;i0)
{
int keep=book[j];
book[j]=book[j+1];
book[j+1]=keep;
}
for(i=1;i<=N;i++)
printf("%s\n",dig[book[i]]);
return 0;
}
>>用strcmp对两串比较作为排序依据,用数组存储排序后的各串顺序,依次输出。
也可以每次比较都进行三次字符串复制( strcpy ),不过要慢许多。
7-31
#include
#include
int main(int argc,char** argv)
{
char str[105];
scanf("%[^\n]",str);
int ind,ins=strlen(str);
scanf("%d",&ind);
ind%=ins;
int i,j;
for(i=1;i<=ins;i++)
{
ind%=ins;
printf("%c",str[ind++]);
}
return 0;
}
>>每次递增下标 ind 时都进行取余运算,以达到循环输出的目的。
7-32
#include
#include
char str[500005];
int book[500005][2];
int main(int argc,char** argv)
{
scanf("%[^\n]",str);
int ind,ins=strlen(str),con=0,booknow=0;
for(ind=0;ind=0;ind--)
{
for(ins=book[ind][0];ins
>>三种基本反转字符串的一种,分析发现这种交换并不改变字符串的输出方向,也就是说都是从左向右输出,只不过输出的起始和终止位置改变了,而且不断的在串内改变起始和终止位置,由此可知一种很简单的方法是扫描一遍原串,用二维数组存储下每个单词的起始位置和终止位置。后从最后一个单词开始不断输出原串中的单词。
速度优于交换字符串后输出的方法。
7-33
#include
int gcd(int m,int n)
{
return m%n?gcd(n,m%n):n;
}
int main(int argc,char** argv)
{
int a1,a2,b1,b2;
scanf("%d/%d %d/%d",&a1,&a2,&b1,&b2);
int lcm=a2*b2/gcd(a2,b2);
int sum=lcm/a2*a1+lcm/b2*b1;
int pr=lcm/gcd(lcm,sum);
if(pr==1)
printf("%d\n",sum/gcd(lcm,sum));
else
printf("%d/%d\n",sum/gcd(lcm,sum),pr);
return 0;
}
>>gcd递归函数求取最大公因数,通分后相加后化简即可。
7-34
#include
char array[20][5][20];
int main(int argc,char** argv)
{
int num,i,j;
scanf("%d",&num);
for(i=0;i=num||j<0)
printf("Not Found\n");
else
printf("%s %s %s %s %s\n",array[j][0],array[j][1],array[j][2],array[j][3],array[j][4]);
}
return 0;
}
>>三维数组直存直取,注意 j 可能是负数。
7-35
#include
int gcd(int m,int n)
{
return m%n?gcd(n,m%n):n;
}
void fk(int *m,int *n)
{
int spgcd=gcd(*m,*n);
*m/=spgcd;
*n/=spgcd;
return;
}
int main(int argc,char** argv)
{
int ind;
scanf("%d",&ind);
int a1=0,a2=1,i;
for(i=1;i<=ind;i++)
{
int b1,b2;
scanf("%d/%d",&b1,&b2);
a1=a1*b2+b1*a2;
a2*=b2;
fk(&a1,&a2);
}
a2*=ind;
fk(&a1,&a2);
if(a2==1)
printf("%d\n",a1);
else if(a1==0)
printf("0\n");
else
printf("%d/%d\n",a1,a2);
return 0;
}
>> fk 函数基于 gcd 函数对输入的分子分母化简,初始化当前分数和为 0/1 ,输入一个分数进行一次通分相加及约分化简,分母乘以除数后化简输出结果。
7-36
#include
void print(double m,double n)
{
if(!(m<0.05&&m>-0.05))
{
printf("%.1lf",m);
if(!(n<0.05&&n>-0.05))
printf("%+.1lfi",n);
}
else if(!(n<0.05&&n>-0.05))
printf("%.1lfi",n);
if((m<0.05&&m>-0.05)&&(n<0.05&&n>-0.05))
printf("0.0");
printf("\n");
}
int main(int argc,char** argv)
{
double x1,x2,x3,x4,sp1,sp2,sp3;
scanf("%lf%lf%lf%lf",&x1,&x2,&x3,&x4);
printf("(%.1lf%+.1lfi) + (%.1lf%+.1lfi) = ",x1,x2,x3,x4);
print(x1+x3,x2+x4);
printf("(%.1lf%+.1lfi) - (%.1lf%+.1lfi) = ",x1,x2,x3,x4);
print(x1-x3,x2-x4);
printf("(%.1lf%+.1lfi) * (%.1lf%+.1lfi) = ",x1,x2,x3,x4);
sp1=x1*x3-x2*x4;
sp2=x1*x4+x2*x3;
print(sp1,sp2);
printf("(%.1lf%+.1lfi) / (%.1lf%+.1lfi) = ",x1,x2,x3,x4);
sp3=x3*x3+x4*x4;
sp1=(x1*x3+x2*x4)/sp3;
sp2=(-x1*x4+x2*x3)/sp3;
print(sp1,sp2);
return 0;
}
>>此题对格式要求严格,前面的 a1、a2、b1、b2 四舍五入保留一位小数,虚数须输出正号。
四个运算结果需要判断是否为 0 ,这个判断是对于四舍五入一位小数后的,(-0.05,0.05) 区间认为是 0 。
7-37
#include
int book[35];
int nowsum,cnt,ind;
void dfs(int sum,int m)
{
int i;
if(sum==nowsum)
{
printf("%d=%d",sum,book[1]);
for(i=2;i
>>DFS。
7-38
#include
int dig[100005];
int main(int argc,char** argv)
{
int num,x,sum=0;
scanf("%d%d",&num,&x);
int i,ind=x;
for(i=1;i<=x;i++)
{
sum+=num*(ind--);
dig[i]=sum%10;
sum/=10;
}
if(sum||!x)
printf("%d",sum);
for(i=x;i>=1;i--)
printf("%d",dig[i]);
return 0;
}
>>乍一看是个大数加法题,其实参与加法的每一位都是相同数字,就可以通过乘法来计算。
想象下把所有需要相加的数列在一起,个位就是数字乘以数的个数。
如:输入>>1 5 ,计算1+11+111+1111+11111,个位就是1*5,处理进位后是( 1*5 )%10,十位是1*4+来自个位的进位,以此递推。
最后需要先输出的是来自最高位的进位,后从高位依次输出,注意不要忘记 0 的特殊情况。