1.提取字符串中的数字
/*
提取字符串中的数字
输入一串字符串,该字符串中可能含有数字,把里面找到的数字求和
例如:
输入: abc123def45ghijk6mn
输出: 174 ---> ( 123 + 45 + 6 )
*/
#include <stdio.h>
#include <string.h>
int get_num_in_string( char *s )
{
int num = 0;
int sum = 0; //保存结果
int i;
for( i=0; i<strlen(s) ; i++ )
{
if( s[i]>='0' && s[i]<='9' ) //是数字
{
num = num*10 + s[i] - 48; //合成数字
if( s[i+1]<'0' || s[i+1]>'9' ) //下一个不是数字
{
sum = sum + num;
num = 0;
}
}
}
return sum;
}
int main()
{
char str[32] = {0};
scanf("%s", str );
int n = get_num_in_string( str );
printf("n = %d\n", n );
}
结果如下图:
2.写一个函数, 实现两个超大数的相加
11374834738563857732723872750952525
347542387382572837532572357
提示: 用字符串
字符转数字,数字转字符
考虑进位
#include <stdio.h>
#include <string.h>
//字符转数字
void char_to_int( char *s )
{
int i=0;
int n = strlen(s);
for(i=0; i<n; i++ )
{
s[i] = s[i] - '0';
}
}
//数字转字符
void int_to_char( char *s , int n)
{
int i;
for(i=0; i<n; i++ )
{
s[i] = s[i] + '0';
}
}
void add_biggest( char *num1, char *num2, char *sum )
{
char *p1, *p2; //定义两个指针,分别指向要处理的数据
p1 = num1 + strlen(num1); //首先指向个位
p2 = num2 + strlen(num2);
int i; //表示 加法的结果最低位保存在sum数组的 下标
i = strlen(num1)>strlen(num2) ? strlen(num1) : strlen(num2) ;
int temp = i;
char_to_int(num1); //把字符转换成数字
char_to_int(num2);
while( p1 != num1 && p2 != num2 ) //当有一个数加完 就结束
{
sum[i] = sum[i] + (*p1 + *p2);
if( sum[i] >= 10 ) //进位
{
sum[i] = sum[i] % 10;
sum[i-1] = sum[i-1] + 1; //进位
}
p1--;
p2--;
i--;
}
if( p1 == num1 && p2 != num2 ) // num2还有剩余
{
while( p2 != num2 )
{
sum[i] = sum[i] + *p2;
if( sum[i] >= 10 )
{
sum[i] = sum[i] % 10;
sum[i-1] = sum[i-1] + 1; //进位
}
p2--;
i--;
}
}
else if( p1 != num1 && p2 == num2 ) // num1还有剩余
{
while( p1 != num1 )
{
sum[i] = sum[i] + *p1;
if( sum[i] >= 10 )
{
sum[i] = sum[i] % 10;
sum[i-1] = sum[i-1] + 1; //进位
}
p1--;
i--;
}
}
//最后 将结果sum 从数字转换成字符
int_to_char( sum, temp );
}
int main()
{
char num1[128] = {58};
char num2[128] = {58};
char sum[129] = {58};
scanf("%s%s", num1+1, num2+1 );
//相加
add_biggest( num1, num2 , sum );
sum[0] = sum[0] - 58;
if( sum[0] == '0' ) //没有进位
{
printf("sum = %s\n", sum+1 );
}
else //有进位
{
printf("sum = %s\n", sum );
}
}
结果如下图:
3.删除字符串中 数字前面的0
/*
输入一串字符,字符串里面可能含有数字,把数字前面的0删除
如果只是一个或者连续的多个0,只保留一个0
输入: abc1000024edfg000023hkjjjj000000lmn0fkkkhjk
输出: abc1000024edfg23hkjjjj0lmn0fkkkhjk
数字前面的0全删
中间的0 不删
连续多个0或者单独一个0 只保留一个0
*/
#include <stdio.h>
#include <string.h>
char *delete_zero( char *s )
{
int flag = 0; //0表示字母,1表示非0数字
int i=0, k=0;
for( i=0; i<strlen(s) ; i++ )
{
if( s[i] > '0' && s[i] <= '9' ) //非0数字
{
flag = 1;
}
if( s[i] < '0' || s[i] > '9' ) //字母
{
flag = 0;
}
//如果本身为0,前面没有出现非0数字,且下一个还是数字,删除
if( s[i] == '0' && flag == 0 && ( s[i+1] >= '0' && s[i+1] <= '9' ) )
{
continue;
}
s[k++] = s[i];
}
s[k] = '\0';
return s;
}
int main()
{
char buf[256] = {0};
scanf("%s", buf );
delete_zero( buf );
printf("%s\n", buf );
}
结果如下图: