进制数相加 char* sum(int n,char* num1,char* num2)

进制数相加 char* sum(int n,char* num1,char* num2)

功能:

第一个参数n 代表多少进制,最大就是36进制,从0到9,然后a到z代表10到35.

char* num1 和char* num2 分别接受两个数字字符串,然后相加得到的结果返回

#include<iostream>
using namespace std;
//n 表示进制数
//a 表示操作数1
//b 表示操作数2
//jy 表示进位数
//jy1 是否进位 
char sum1(int n,char a,char b,int jy,int* jy1)
{
    int num1=0;
    int num2=0;
    if(isdigit(a)) num1=a-'0';
    else num1=a-'a'+10;
    if(isdigit(b)) num2=b-'0';
    else num2=b-'a'+10;
    if(num1+num2+jy>n)
    {
    
        int temp=num1+num2+jy-n;
        *jy1=1;
        if(temp<10)
        {
            return '0'+temp;
          
        }
        else
        {
            
            return 'a'+temp-10;
            
        }
    }
    else
    {
       
        int temp=num1+num2+jy;
        *jy1=0;
        if(temp<10)
        {
            return '0'+temp;
          
        }
        else
        {
            
            return 'a'+temp-10;
            
        }    
    }
}
char* sum(int n,char* num1,char* num2)
{
    int num1_len= strlen(num1);
    int num2_len=strlen(num2);
    int max=num1_len>num2_len?num1_len:num2_len;
    int jy=0;
    char *he=new char[max+2];
    memset(he,0,max+2);
    for(int i=0;i<max+1;i++)
    {
        char a;
        char b;
        if(num1_len-1-i>=0)
        {
             a=num1[num1_len-1-i];
            
            
        }
        else{
            a='0';
        }
        if(num2_len-1-i>=0)
        {
           b=num2[num2_len-1-i]; 
        }
        else
        {
            b='0';
        }
        he[i]=sum1(n,a,b,jy,&jy);
        
    } 
    return he;
} 
int main()
{
    char* num1=new char[100];
    char* num2=new char[100];
    int n;
    while(cin>>num1>>num2>>n)
    {
        char* p=sum(n,num1,num2);
        for(int i=0;i<strlen(p);i++)
         {
           if(p[strlen(p)-1-i]=='0')continue;
             cout<<p[strlen(p)-1-i];
        }
    }

    

    getwchar();
    return 0;
}

 

转载于:https://www.cnblogs.com/Small-Life/p/4009327.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来给您讲解一下。 首先,我们需要明确一下身份证号码的校验规则。身份证号码的最后一位是校验位,是根据前面 17 位计算得出的。具体的计算方法是: 1. 将身份证号码前 17 位分别乘以对应的系(系从左到右依次为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2)。 2. 将上述结果相加得到一个。 3. 用上述结果除以 11,得到的余就是校验位对应的字。余为 0 则校验位为 1,余为 1 则校验位为 0,余为 2 则校验位为 X,余为 3~10 则校验位为对应的字(例如余为 3,则校验位为 3)。 接下来,我们就可以根据上述规则来写代码了。具体的实现方式是:将身份证号码前 17 位分别存入一个结构体中的组中,并定义一个指向该结构体的指针,然后编写一个函 checkID,该函接受一个 char 类型的指针作为参,指向身份证号码的字符串,返回值为 int 类型,表示校验位是否正确。 下面是代码实现及注释: ```c #include <stdio.h> struct ID { int num[17]; // 存储身份证号码前 17 位 }; int checkID(char *ID) { int i, sum = 0, mod; // sum 存储前 17 位乘以系后的结果之和,mod 存储 sum 对 11 取余的结果 struct ID id; // 定义一个 ID 类型的结构体 int *p = id.num; // 定义一个指向 id.num 组的指针 // 将身份证号码前 17 位转换成字并存储到 id.num 组中 for (i = 0; i < 17; i++) { *(p + i) = *(ID + i) - '0'; } // 计算前 17 位乘以系后的结果之和 for (i = 0; i < 17; i++) { sum += *(p + i) * (i % 2 == 0 ? 7 : (i % 2 == 1 ? 9 : 0)); } // 计算 sum 对 11 取余的结果 mod = sum % 11; // 判断校验位是否正确并返回相应的值 if (mod == 0 && *(ID + 17) == '1') { return 1; } else if (mod == 1 && *(ID + 17) == '0') { return 1; } else if (mod == 2 && *(ID + 17) == 'X') { return 1; } else if (mod >= 3 && mod <= 10 && *(ID + 17) == mod + '0') { return 1; } else { return 0; } } int main() { char ID[18] = "11010119900307663X"; // 测试用的身份证号码 if (checkID(ID)) { printf("校验位正确!\n"); } else { printf("校验位错误!\n"); } return 0; } ``` 希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值