1048. 数字加密
2016-02-24 23:28
211 查看
本题要求实现一种数字加密方法。首先固定一个加密用正整数A,对任一正整数B,将其每1位数字与A的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对13取余——这里用J代表10、Q代表11、K代表12;对偶数位,用B的数字减去A的数字,若结果为负数,则再加10。这里令个位为第1位。
输入格式:
输入在一行中依次给出A和B,均为不超过100位的正整数,其间以空格分隔。
输出格式:
在一行中输出加密后的结果。
输入样例:
输出样例:
算法:
算法开始。
用两个字符串存储A和B。
用两个字符指针分别指向A和B末尾。第三个字符指针指向空间与B一样大的字符地址。
如果是奇数位,字符指针指向的字符都减去‘0’,相加除以13取余,如果小于10,加上‘0’,如果大于9,用J代表10,Q代表11,K代表12,存储于第三个字符指针中。
如果是偶数位,第二个字符指针指向的字符减去第一个,如果结果是负数,则再加上10,存储于第三个字符指针中。
如果两个字符指针都大于指向A和B开头,则三个字符指针都减一。回到第四步。
如果第二个指针不等于B开头,则*(--第三个指针)=*(--第二个指针)。直到第二个指针等于B开头。
输出第三个字符串。
算法结束。
时间复杂度:O(n),空间复杂度O(1)。注意,如果A长度大于B的话,输出的密文长度要等于A,而且A长度大于B的部分B该位上当作为0。修改scanf_s函数就可以在PAT上AC。
输入格式:
输入在一行中依次给出A和B,均为不超过100位的正整数,其间以空格分隔。
输出格式:
在一行中输出加密后的结果。
输入样例:
1234567 368782971
输出样例:
3695Q8118
算法:
算法开始。
用两个字符串存储A和B。
用两个字符指针分别指向A和B末尾。第三个字符指针指向空间与B一样大的字符地址。
如果是奇数位,字符指针指向的字符都减去‘0’,相加除以13取余,如果小于10,加上‘0’,如果大于9,用J代表10,Q代表11,K代表12,存储于第三个字符指针中。
如果是偶数位,第二个字符指针指向的字符减去第一个,如果结果是负数,则再加上10,存储于第三个字符指针中。
如果两个字符指针都大于指向A和B开头,则三个字符指针都减一。回到第四步。
如果第二个指针不等于B开头,则*(--第三个指针)=*(--第二个指针)。直到第二个指针等于B开头。
输出第三个字符串。
算法结束。
时间复杂度:O(n),空间复杂度O(1)。注意,如果A长度大于B的话,输出的密文长度要等于A,而且A长度大于B的部分B该位上当作为0。修改scanf_s函数就可以在PAT上AC。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 101 int main(void) { char *ptr1, *ptr2, *ptr3; int i, j, k, temp; int numA, numB; int count = 1; int flag = 0; ptr1 = (char*)calloc(N, sizeof(char)); ptr2 = (char*)calloc(N, sizeof(char)); ptr3 = (char*)calloc(N, sizeof(char)); scanf_s("%s", ptr1, N); scanf_s("%s", ptr2, N); i = strlen(ptr1); j = strlen(ptr2); k = i > j ? i : j; ptr3[k] = ptr2[j]; do { i--; j--; k--; numA = (i >= 0 ? ptr1[i] - '0' : 0); numB = (j >= 0 ? ptr2[j] - '0' : 0); if (count % 2) { temp = (numA + numB) % 13; if (temp < 10) { ptr3[k] = '0' + temp; } else { switch (temp) { case 10: ptr3[k] = 'J'; break; case 11: ptr3[k] = 'Q'; break; case 12: ptr3[k] = 'K'; break; default: break; } } } else { temp = numB - numA; if (temp < 0) { temp += 10; } ptr3[k] = '0' + temp; } count++; } while (k > 0); puts(ptr3); free(ptr1); free(ptr2); free(ptr3); return 0; }
相关文章推荐
- 让Faster R-CNN支持TX1的fp16(half float, float16)特性(实现ing)
- iOS网络编程-ASIHTTPRequest框架同步请求-备用
- HDU 3264 Open-air shopping malls(计算几何 && 二分优化)
- iOS绘图教程
- 在Android Studio使用自定义属性
- leetcode:Recover Binary Search Tree
- 2.24 Java基础总结 ①for-each循环②继承概念③全类名④方法重写
- objective-c set/get方法(自定义自己的set/get方法)
- 编译android源码6---运行android编译源码
- 2.23Java基础总结 ①内存图,内存加载过程②内存叠加③动态绑定
- httpd.conf详细解释
- MD5加密字符串-备用
- HDU 4864
- hibernate saveOrUpdate方法和merge的区别
- 事务的四个特性(ACID)
- 2.23 Java基础总结 ①toString方法②equals③this和super④final⑤常量
- Android 线程 Looper.prepare()、Looper.loop() Looper.prepare()和Looper.loop() —深入版
- Linux下基于GTK的C/S聊天软件
- javaScript学习笔记(六)
- 【hdu1198】Farm Irrigation——并查集