洛谷新手村的收获

关于洛谷新手村的收获

以下按题目顺序排列

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;
 }
判断被调函数是否成立可直接在函数中写return 0和return 1,然后在if语句中输入即可,如    if(hw(i)&&prime(i))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值