算法竞赛入门经典 3-3 乘积的末三位 习题 3-4 计算器 习题3-5 旋转

这篇博客介绍了两道算法竞赛习题:一是计算输入整数(忽略字母字符串)乘积的末三位;二是实现一个简单的计算器,处理包含加减乘运算的非负整数表达式。同时强调了处理输入和清零操作的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

习题3-3 乘积的末三位

输入若干个单词,输入若干个整数(可以是正数、负数或者零),输出它们的乘积的末三位。这些整数中会混入一些由大写字母组成的字符串,你的程序应当忽略它们。提示:试试看,在执行scanf(“%d”)时输入一个字符串会怎样?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 100
#define MOD 1000
char a[MAXN];

int main(int argc, char *argv[])
{
  int i, n;
  long sum = 0, product = 1;
  int sign;
  while(scanf("%s", a) == 1)
  {
     n = strlen(a);
     for(i = 0; i < n; i++)
     {
         if(a[i] >= 'A' && a[i] <= 'Z') break; //一定要判断是怎么退出的 
         if(a[i] == '-' || a[i] == '+')  continue;
         sum = (sum*10 + a[i] - '0')%MOD;  
     }
     if(a[i] >= 'A' && a[i] <= 'Z') continue;
     product = product*sum%MOD;
     sum = 0;//这种计数用的,每次都要清零 
  }
  printf("%3d\n", product);
  system("PAUSE");	
  return 0;
}

总结:1 注意溢出

            2 for循坏里有break时,接下来的代码要判断这个for循坏是从哪退出的

            3  sum = 0 要记得清零,因为读入一个新的字符串了

习题 3-4 计算器

编写程序,读入一行恰好包含一个加号、减号或乘号的表达式,输出它的值。这个运算符保证是二元运算符,且两个数均为不超过100的非负整数。运算数和运算符可以紧挨着,也可以用一个或多个空格、TAB隔开。行首末尾均可以有空格。提示:选择合适的输入方法可以将问题简化。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 100
char a[MAXN];
 
int main(int argc, char *argv[])
{
   int i, n, x = 0, y = 0, middle; 
   
   while(fgets(a, sizeof(a), stdin))
   {
      n = strlen(a);
      for(i = 0; i < n-1; i++)
      {
         if(a[i] == '+' || a[i] == '-' || a[i] == '*')
           middle = i; 
      }
      for(i = 0; i < middle; i++)
      {
         if(a[i] == ' ') continue;
         x = x*10 + a[i] - '0';
      }
      for(i = middle+1; i < n-1; i++ )
      {
          if(a[i] == ' ') continue;
          y = y*10 + a[i] - '0';
      }
      
      switch(a[middle])
      {
      case '+':
           printf("%d\n", x+y);break;
      case '-':
           printf("%d\n", x-y);break;
      case '*':
           printf("%d\n", x*y);break;
      }
      x = 0;
      y = 0;
   }
  system("PAUSE");	
  return 0;
}

总结:1 用fgets输入最后还有一个\n 和\0,不过strlen不降\0算进去

            2 x y要清零

转一个更简单的方法

#include<stdio.h> 
#define MAXN 5000  
int main()  
{   int a,b,c; 
    char f;      
    scanf("%d",&a);     
    scanf("%c",&f);  
    while((f!='+')&&(f!='-')&&(f!='*'))
       scanf("%c",&f);     
       scanf("%d",&b); 
       if (f=='+') c=a+b;  
       else  if(f=='-') c=a-b; 
       else    c=a*b;      
    printf("%d",c);  return 0; 
}  

习题 3-5 旋转

输入一个n*n的字符矩阵,把它左转90度后输出。


#include <stdlib.h>
#define MAXN 100
char a[MAXN][MAXN];

int main(int argc, char *argv[])
{
   int n, i, j;
   scanf("%d\n", &n);
   
   for(i = 0; i < n; i++)
      scanf("%s", a[i]);
     
     /*
   for(i = 0; i < n; i++)
      {
      for(j = 0; j < n; j++)
         scanf("%c", &a[i][j]); 
      }
  */
   for(j = n-1; j >= 0; j--)
      {
      for(i = 0; i < n; i++)
         {
            printf("%c", a[i][j]);
         }
      printf("\n");
      }   
   system("PAUSE");	
   return 0;
}

总结:scanf("%c")会将字符后的空格或换行也读进去????
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值