第二次周练
第一题:
这道题最主要的是找规律,和斐波那契数列一样;下表是规律
从第四站开始 a 前面的系数等于前两站 a 的系数之和减一; 从第四站开始 b 前面的系数等于前两站 b 的系数之和加一;因此我们需要用两个数组把a 和 b 的系数存起来,前三项没有规律我们需要把前三项列举出来。
#include<stdio.h>
int main()
{
int numa[25]={0,1,1,2};
int numb[25]={0,0,0,0};
int i,a,b,n,m,x;
scanf("%d %d %d %d",&a,&n,&m,&x);
for(i=4;i<n;i++)
{
numa[i]=numa[i-1]+numa[i-2]-1;
numb[i]=numb[i-1]+numb[i-2]+1;
}
b=(m-a*numa[n-1])/numb[n-1];
printf("%d",numa[x]*a+numb[x]*b);
return 0;
}
第二题:进制转化
在负进制,如果余数<0,那么:余数-=m;商++;
#include<stdio.h>
int jinzhizhuanhua(int n,int a,char c[])
{
int i=0,r;
while(n!=0)
{
r=n%a;
n/=a;
if(r<0) //负进制的核心
{
r=r-a; //如果余数是负数则减去负进制数
n++; //向上取整
}
if(r>9)
{
c[i]=r-10+'A';
}
else c[i]=r+'0';
i++;
}
return i-1;
}
int main()
{
int n,a,j;
char c[100];
scanf("%d %d",&n,&a);
printf("%d=",n);
if(n==0) printf("0");
else
{
for(j=jinzhizhuanhua(n,a,c);j>=0;j--)
printf("%c",c[j]);
}
printf("(base%d)",a);
return 0;
}
第三题:
这道题和上周的原版类似主要是判断三次质数,需要两次循环
#include<stdio.h>
#include<math.h>
int zhishu(int n)
{
int i,q;
q=(int)sqrt(n);
if(n==1) return 0;
for(i=2;i<=q;i++)
{
if(n%i==0) return 0;
}
return 1;
}
int main()
{
int i,k,j,t,x;
int n,falg=0;
scanf("%d",&n);
for(i=2;i<n-4;i++)
{
k=i;
if(zhishu(k))
{
for(j=2;j<n-4;j++)
{
t=j;
if(zhishu(t))
{
x=n-k-t;
if(zhishu(x))
{
printf("%d %d %d",k,t,x);
falg=1; //需要用来判断,跳出外循环
break;
}
}
}
if(falg==1) break;
}
}
return 0;
}
第四题:
这道题主要是逆向思维,每次翻转 n-1 次实际就相当于翻转一个,所以 n 个硬币需要翻转 n 次;
第几次翻转只需要把第几个硬币不翻转,其余 n-1 个翻转。
#include "stdio.h"
int main()
{
int n,i,j;
int a[102]={0};
scanf("%d",&n);
printf("%dn",n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(j!=i)
{
if(a[j]) a[j]=0;
else a[j]=1;
}
printf("%d",a[j]);
}
printf("n");
}
return 0;
}
第五题:
#include<stdio.h>
int main()
{
int n,k;
int sum=0;
scanf("%d %d",&n,&k);
sum+=n;
while((n-k)>=0) //当烟头数大于k时继续循环
{
n=n-k; //每抽k根烟,剩余的烟数量
sum++; //多抽一根烟
n++; //得到一个烟头
}
printf("%d",sum);
return 0;
}
大佬解法(大家一起学习)
#include<stdio.h>
int main()
{
int n,k;
int sum;
scanf("%d %d",&n,&k);
sum=n+(n-1)/(k-1);
printf("%d",sum);
return 0;
}
第六题:
字符串
#include<stdio.h>
#include<string.h>
int main()
{
char a[15];
int n,i,j;
scanf("%s",a);
n=strlen(a);
i=n-1;
while(1)
{
if(a[i]=='0')
i--;
else break;
}
if(a[0]=='-')
{
printf("-");
for(;i>0;i--)
printf("%c",a[i]);
}
else
{
for(;i>=0;i--)
printf("%c",a[i]);
}
return 0;
}
数字,以为题目要求 -1000000000<=N<=1000000000,在整形范围内
#include<stdio.h>
int main()
{
int n,t,sum=0;
scanf("%d",&n);
if(n<0)
{
printf("-");
n=-n;
}
if(n%10==0) n/=10;
while(n!=0)
{
t=n%10; //将n的最后一位取出来
sum=sum*10+t; //将n翻转
n/=10; //将n去掉一位
}
printf("%d",sum);
return 0;
}
第七题:
#include<stdio.h>
int yueshu(int n,int m)
{
int r;
r=n%m;
while(r)
{
n=m;
m=r;
r=n%m;
}
return m;
}
int max(int x,int y)
{
return x>y?x:y;
}
int min(int x,int y)
{
return x<y?x:y;
}
int main()
{
int a,b,c;
int max1,min1,yue;
scanf("%d %d %d",&a,&b,&c);
max1=max(max(a,b),c);
min1=min(min(a,b),c);
yue=yueshu(max1,min1);
printf("%d/%d",min1/yue,max1/yue);
return 0;
}
第八题:
简单的枚举
#include<stdio.h>
#include<string.h>
int main()
{
char a[205],ch;
int n,i,sum=0;
gets(a);
n=strlen(a);
for(i=0;i<n;i++)
{
ch=a[i];
if(ch=='a'||ch=='d'||ch=='g'||ch=='j'||ch=='m'||ch=='p'||ch=='t'||ch=='w')
sum++;
if(ch=='b'||ch=='e'||ch=='h'||ch=='k'||ch=='n'||ch=='q'||ch=='u'||ch=='x')
sum=sum+2;
if(ch=='c'||ch=='f'||ch=='i'||ch=='l'||ch=='o'||ch=='r'||ch=='v'||ch=='y')
sum=sum+3;
if(ch=='s'||ch=='z')
sum=sum+4;
}
printf("%d",sum);
return 0;
}
下标法,ASCII码值法
#include<stdio.h>
#include<string.h>
int main()
{
char a[205],ch;
int num[26]={1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,4,1,2,3,1,2,3,4};
int n,i,sum=0;
gets(a);
n=strlen(a);
for(i=0;i<n;i++)
{
ch=a[i];
if(ch>='a'&&ch<='z') sum+=num[ch-'a'];
if(ch==' ') sum++;
}
printf("%d",sum);
return 0;
}
第九题:
#include<stdio.h>
#include<string.h>
int max(int a,int b) //求最大值函数
{
return a>b?a:b;
}
int main()
{
int num[26]={0};
int i,j,n,max1=0;
char a[85];
for(i=0;i<4;i++)
{
gets(a);
n=strlen(a);
for(j=0;j<n;j++)
{
if(a[j]>='A'&&a[j]<='Z')
num[a[j]-'A']++;
}
}
for(i=0;i<26;i++) //找出柱形图的最高数
max1=max(max1,num[i]);
for(i=max1;i>0;i--) //从最高数开始递减
{
for(j=0;j<26;j++) //把每个字母都循环一变
{
if(num[j]>=i) //如果这个字母出现的次数大于外循环的变量就打印 * ,否则打印空格
printf("* ");
else
printf(" ");
}
printf("n");
}
printf("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z");
}
第十题:
凑个数吧
#include<stdio.h>
int main()
{
int n,i,j;
int a[100],b[100]={0};
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
if(a[i]>a[j])
b[i]++;
}
}
for(i=0;i<n;i++)
printf("%d ",b[i]);
}
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码