程序语言语法上手题目合集
- 1跑步
- 2猜年龄
- 3Vigenère 密码
1跑步
2.跑步 - 蓝桥云课
枚举日期,判断是否符合条件即可。
参考程序:
#include<stdio.h> int y=2022,m=1,d=1;
int week=6;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};int judg(){if(d%10==1||week==6||week==7)return 1;return 0;
}void f() {int cnt=0;while(y!=2023){++d;++week;if(d>month[m]){m++;d=1;if(m>12){y++;m=1;}}if(week>7){week=1;}cnt+=judg();} printf("%d",cnt);
}int main() {//f();printf("138");return 0;
}
本题是一道填空题,唯一的测试用例是138。
2猜年龄
6.猜年龄 - 蓝桥云课
纯枚举,这个数学王子很年轻,所以年龄不会很大。
#include<stdio.h>
int main() {int cnt[10]={0};//count,计数用 int i=0;for(i=11;i<=36;i++){int a=i*i*i;//立方 int b=a*i;//四次方//统计每一位 while(a!=0){cnt[a%10]++;a/=10; }while(b!=0){cnt[b%10]++;b/=10; }//cnt全是1,则i即为正确答案 int j=0;for(j=0;j<10;j++){if(cnt[j]==1)continue;elsebreak;}if(j==10){printf("%d",i);return 0;}for(j=0;j<10;j++){cnt[j]=0;}}//printf("18");//其实可以把次方数输出,肉眼观察 return 0;
}
这是一道填空题,唯一的测试用例是18。
3Vigenère 密码
NOIP2012 提高组] Vigenère 密码 - 洛谷 | 计算机科学教育新生态
参考程序1:对着表查
这里放张贴图,防止有人不知道怎么看这张表:
#include<stdio.h>
#include<string.h>int main(){//生成维吉尼亚表// 维吉尼亚表的实质:table[秘钥][明文] = 密文 char table[26][26]={'\0'};int i=0,j=0;for(i=0;i<26;i++){for(j=0;j<26;j++){table[i][j]=(char)((i+j)%26+'a');}}char key[2001]={'\0'},sec[2001]={'\0'},//秘钥,密文 ans[101]={'\0'},tmp2[1001]={'\0'};scanf("%s",key);scanf("%s",sec);strcpy(ans,key);int lkey=strlen(key),lsec=strlen(sec);//补全秘钥长度 while(lkey<lsec){strcat(key,ans);lkey=strlen(key);}//翻译时统一用小写,并记录密文哪个位置是大写 for(i=0;i<lkey;i++)if(key[i]<'a'){key[i]+='a'-'A';}for(i=0;i<lsec;i++)if(sec[i]<'a'){sec[i]+='a'-'A';tmp2[i]='a'-'A';}//查表for(i=0;i<lsec;i++)for(j=0;j<26;j++)if(table[key[i]-'a'][j]==sec[i]){printf("%c",j+'a'-tmp2[i]);break;}return 0;
}
参考程序2:找规律
样例输入:
CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm
样例输出:
Wherethereisawillthereisawayvigenere的实质:
Y=Y-(C-A)=Y-2=W(y往前挪动2个单位)
v=v-(o-a)=v-14=h
q=q-(m-a)=q-12=e
r=g-(p-a)=g-16=a-9,需要加一个26让它重回正轨(相当于是绕回来转一圈)。所以是
r=g-(p-a)+26=g-16+26=a-9+26=a+17=r
#include<stdio.h>
#include<string.h> int main(){char key[2002]={'\0'},sec[2002]={'\0'},tmp[1001]={'\0'};scanf("%s%s",key,sec);int lkey=strlen(key),lsec=strlen(sec);//加长key strcpy(tmp,key);while(lkey<lsec){strcat(key,tmp);lkey=strlen(key);}//转换时字母统一小写 int i=0;for(i=0;i<lkey;i++){if(key[i]<'a'){key[i]+='a'-'A';}}//标记密文的大写字母 for(i=0;i<lsec;i++){if(sec[i]<'a'){sec[i]+='a'-'A';tmp[i]='a'-'A';}else tmp[i]='\0';}for(i=0;i<lsec;i++)printf("%c",(sec[i]-key[i]+'a'<'a'?sec[i]-key[i]+'a'+26:sec[i]-key[i]+'a')-tmp[i]);return 0;
}