最近在做《算法竞赛入门经典》时,有道题是 乘积的末三位。 要求:输入若干整数(可以是正数、负数或者零),输出他们的乘积的末三位。这些整数中会混入一些由大写字母组成的字符串,你的程序应当忽略他们。
思考之后,其实这道题的难点就是提取数字。在网上查找相关资料时,有网友提出atoi的函数可以从字符串中提取数字,确实是这样。不过还有就是要把里面的数字全都提取出来,那就把指针加上这个数字的长度。
代码如下(没有提供末三位的代码):
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char buf[] = "aaaBBB++++123ad-345dd";
int num = 0, count = 0, sum = 1;
char *p;
p = buf;
while (*p != '\0')
{
if ((*p > '0' && *p <= '9') || (*p == '+' || *p == '-')) //判断是否是数字的起点
{
if(*p == '+' || *p == '-') //判断是否有征服号
if(!(*(p+1) > '0' && *(p+1) <= '9') ) //判断下一个字符是否为数字
{
p++; //若不是数字则此正负号是字符,跳出继续循环
continue;
}
else count = 1;<span style="font-family: Arial, Helvetica, sans-serif;"> //是数字则数字长度加1,因为atoi不记入字符</span>
<span style="font-family: Arial, Helvetica, sans-serif;">
</span>
num = atoi(p);
if(*(p-1) == '-') //如果是负数,则乘以-1,sum计算乘积
sum= -1*sum*num;
else
sum *= num;
printf("num = %d\n", num);
while (num / 10 != 0)
<span style="white-space:pre"> </span>{ //计算数字位数
++count;
num = num / 10;
}
p=p+count+1; //转到数字下一位 +1是因为算位数的时候少算了一位
continue;
}
p++; //是字符则指针后移一位
}
printf("sum = %d\n", sum);
return 0;
}
这道题的关键是取字符串中的数字。