关于洛谷新手村的收获
以下按题目顺序排列
p1085
for循环也可以用在实数中,之前一直以为只能给数组用
#include<stdio.h>
int main(){
int i,a,b,c,d=0,max=0;
for(i=1;i<8;i++){
scanf("%d%d",&a,&b);
c=a+b;
if(c>8&&c>max){
max=c;
d=i;
}
}
printf("%d",d);
return 0;
}
p1909
判断相等时用两个等号
p1035
在查错时可用printf()输出并用getchar()隔断
p1980
在判断多位数每个数字是否与题设相等时,可用%与/将每位取出,存位,赋值再讨论
#include<stdio.h>
int main(){
int n,x,a,b,i,t=0;
scanf("%d%d",&n,&x);
for(i=1;i<=n;i++){
a=i;
while(a!=0){
b=a%10;
a=a/10;
if(b==x)
t++;
}
}
printf("%d",t);
return 0;
}
p1427
不知道for循环在什么地方终止是可空下,然后用一个if判断并break
for(i=0;;i++){
scanf("%d",&a[i]);
if(a[i]==0)
break;
i++;
}
p2141
用b[i]=a[i]将数组中的元素进行复制,可根据情况对b数组进行操作而不改变原数组
#include<stdio.h>
int main(){
int a[100],b[100];
int n,i,k,j,count=0;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
for(i=0;i<n;i++){
for(j=1;j<n;j++){
for(k=0;k<n;k++){
if(a[i]+a[j]==b[k]){
count++;
b[k]=0;
}
}
}
}
printf("%d",count);
return 0;
}
p1055
可用字符串来存储数字,如要对存储的数字进行操作,则需要减’0’或48,更改char类型的数组里的数字,不能直接赋值,可将数字存在char类型的字符串中,在数组层面进行操作
#include<stdio.h>
int main(){
char a[14],b[12]="0123456789X";
int i,j=1,t=0;
scanf("%s",a);
for(i=0;i<12;i++){
if(a[i]=='-')
continue;
t=t+(a[i]-'0')*j++;
}
if(a[12]==b[t%11])
printf("Right");
else{
a[12]=b[t%11];
printf("%s",a);
}
return 0;
}
p1200
计算字符数组要遍历时,可以使用strlen()函数,也可以用最后一个数组元素!=’\0’做为结束标记
p1208
灵活使用for循环和if判断语句,continue和break的跳出用法,tolower()和toupper()函数在c的ctype.h库中,使用的时候要加此头文件, 两个函数可分别实现字母的小大写转换
for(int i=0;i<lena;++i)
b[i]=tolower(a[i]);
for(int i=0;i<lenb;++i)
a[i]=toupper(b[i]);
p1914
有时要注意题目里的隐含条件,此题中仅有26个字母,即要注意是否合理,可以给字符元素加n代表向后移动几位,如a 加2 则此元素变为 c
#include<stdio.h>
int main(){
char a[51];
int i,n;
scanf("%d",&n);
scanf("%s",a);
for(i=0;a[i]!='\0';i++)
a[i]=(a[i]-'a'+n)%26+'a';
//a[i]-'a':读入中对应的第几个字母的位置,比如'a'对应0,'b'对应1,'c'对应2(0开始);
//a[i]-'a'+n:读入中对应字母加上转移位数得到的字母的对应位置。
//比如说'c'这个字母移动3位,就是第2个字母向右移动3个,就是第五个字母,即'f'
//取余26是防止移动位数超过26导致炸掉
//再加上'a',将对应位置还原成字母,再打出来
printf("%s",a);
return 0;
}
p1036
可在程序开头定义一个全局变量,以后每个程序都可以使用此变量且不用定义
知道深搜代码 如下:
void rec(int start, int count, int sum) {
int i;
if (count == k && prime(sum)==1) {
ans++;
}
for (i = start; i <= n; i++) {
rec(i + 1, count + 1, sum + a[i]);
}
}
p1149
看懂了如何将代码的时间复杂度减小,使之避免超时
①for (int a = 0;a <= 1111;a++)
{
for (int b = 0;b <= 1111;b++)
{
c = a + b;
if (f[a] + f[b] + f[c] == n-4)
{
total++;
}
}
c = 0;
}
② for (i=0;i<=999;i++){
if(a[i]<n){ //i为c
for(j=0;j<=i;j++){ //因为加数总小于c
if(a[i]+a[j]+a[i-j]==n-4)
count++;
}
}
}
p1217
判断素数要注意2是一个素数(n=1,n%2==0,2划分三段),也可将能被二整除的数跳过,减少时间复杂度
判断回文数可将数字逆向输出看是否相等,代码如下
int hw(int n) {
int sum=0;
int k=n;
while(n!=0) {
sum=sum*10+n%10;
n/=10;
}
if(sum==k)
return 1;
else
return 0;
}