能力值:
( LV9,RANK:420 )
|
-
-
2 楼
用Delphi写吧,Delphi的copy()很强大的
PS:我不会写,我只会吹而已
|
能力值:
( LV13,RANK:760 )
|
-
-
3 楼
让我先想想……
|
能力值:
(RANK:410 )
|
-
-
4 楼
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
char s[256] = {0};
char sn[256] = {0};
int i;
char c;
char tmp[4] = {0};
int len;
printf("请输入你的机器码:");
scanf("%s",&s);
printf("\n");
len = strlen(s);
for (i = 0; i < len; i++)
{
c = ((char)((s[i] + 1) * 7)) % 10;
itoa(c,(char*)&tmp,10);
c = tmp[0];
*(unsigned long*)&tmp = 0;
sn[len-i-1] = c;
}
printf("你的注册码是:%s\n",sn);
system("pause");
return 0;
};
|
能力值:
( LV9,RANK:420 )
|
-
-
5 楼
说实话,到现在我对算法都不是很明白
|
能力值:
(RANK:410 )
|
-
-
6 楼
我的代码就是按照他描述的算法写出来的,不过我试了下他给的机器码计算了一下,得到得结果和他给出的结果不同,所以也不太敢肯定这样写对不对。
for (i = 0; i < len; i++)
{
c = ((char)((s[i] + 1) * 7)) % 10; // 这个计算就是他描述的将机器码每一位ASCII码加1,乘以7,将结果转换成char类型再除以10取余。
itoa(c,(char*)&tmp,10); // 将上面得到的结果转换成字符类型,保存在tmp变量中。
c = tmp[0]; // 取出转换后的第一个字符。如果这个字符是"-5",那么c就会等于"-"号。
*(unsigned long*)&tmp = 0; // 将tmp变量重初始化为0进行下一轮运算。
sn[len-i-1] = c; // 将得到的值按倒序存入。
}
|
能力值:
( LV9,RANK:420 )
|
-
-
7 楼
主要是第四步那里,我感觉楼主没有把算法描述清楚
for (i = 0; i < len; i++) { c = ((char)((s + i) * 7)) % 10; // 这个计算就是他描述的将机器码每一位ASCII码加1,乘以7,将结果转换成char类型再除以10取余。
// 这里应该是加i才对,因为楼主说的是加循环变量的值
itoa(c,(char*)&tmp,10); // 将上面得到的结果转换成字符类型,保存在tmp变量中。
c = tmp[0]; // 取出转换后的第一个字符。如果这个字符是"-5",那么c就会等于"-"号。
// 这样不是每次都要取吗?这样不会覆盖吗?这样算的如果是负数的话是对的,那如果是正数呢?每次都只取第一位? *(unsigned long*)&tmp = 0; // 将tmp变量重初始化为0进行下一轮运算。
sn[len-i-1] = c; // 将得到的值按倒序存入。
// 这里这个倒序很好玩,学习了 }
|
能力值:
(RANK:410 )
|
-
-
8 楼
// 刚才没注意到是加i值的,改了之后得到的结果就和楼主给的一样了。
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
char s[256] = {0};
char sn[256] = {0};
int i;
char c;
char tmp[4] = {0};
int len;
printf("请输入你的机器码:");
scanf("%s",&s);
printf("\n");
len = strlen(s);
for (i = 0; i < len; i++)
{
c = ((char)((s[i] + i) * 7)) % 10;
itoa(c,(char*)&tmp,10);
c = tmp[0];
*(unsigned long*)&tmp = 0;
sn[len-i-1] = c;
}
printf("你的注册码是:%s\n",sn);
system("pause");
return 0;
};
|
能力值:
(RANK:410 )
|
-
-
9 楼
// 这样不是每次都要取吗?这样不会覆盖吗?这样算的如果是负数的话是对的,那如果是正数呢?每次都只取第一位?
*(unsigned long*)&tmp = 0; // 将tmp变量重初始化为0进行下一轮运算。
是的,每次都要取,而且也要覆盖掉,因为每次计算得到的结果都是不同的。正数也是取第一位字符的。
|
能力值:
( LV6,RANK:90 )
|
-
-
10 楼
谢谢小虾大侠!其实他的这个算法是有漏洞的!关键就是有内存缢出,要不然就好写了!小子贼野大大我也懂点点DELPHI不过用D要实现就难了因为涉及了低八位的运算,D的话就要加入汇编,但是那益出问题还是不能解决!
|
能力值:
(RANK:410 )
|
-
-
11 楼
delphi处理八位数据也很好处理的,并不用用到汇编。你所说的溢出是什么?
|
能力值:
( LV13,RANK:760 )
|
-
-
12 楼
嗯,这段代码写得比较精练,我还在想什么意思呢...
|
能力值:
( LV6,RANK:90 )
|
-
-
13 楼
是吗?"-5"不是溢出造成的吗?低八位明明是F1/A=18,结果经是"-5"晕透了!
|
能力值:
(RANK:410 )
|
-
-
14 楼
0xF1按有符号数来看就是-15,-15 % 10 = -5 没错,并不属于溢出。
|
能力值:
( LV6,RANK:90 )
|
-
-
15 楼
|
能力值:
( LV9,RANK:420 )
|
-
-
16 楼
这个算法很有意思,至少我是这么认为的
小虾老大给的代码已经和你的结果一样了呀,难道注册还是不行吗?
这个算法我是不懂,我用Delphi也写不出来,用C写还是看了小虾老大以后的才理解的
个人认为你没描述清楚算法,我按照我的理解和小虾老大写的代码写了一下我的理解
1、取机器码的Ascii,记为szAscii,然后让c = (char)((s[i]+i)*7) % 10;
这里的(char)是把数字转为字符;
2、再让temp = (char)c,因为C语言不允许这么做,所以就要用到itoa这个函数,
写成C就是这样的:itoa(c,(char *)&temp,10),参数不懂的自己百度
3、然后在让c = temp[0];也就是说取第一位,然后把temp[0]清零;
4、把c倒序在sn的最后一位,也就是倒序,sn[len - i - 1] = c;//这个倒序很好玩,值得我学习
我不明白你写的第四步是什么意思,但是小虾老大写的代码发出来以后我才明白你写的第四步其实就是要取求余以后的第一个字符
以上完全是我的个人理解,如果不对的话请指出错在哪里,谢谢
PS:由于我学艺不精,所以不能帮你解决问题,我只能说到这了,不好意思
|
能力值:
( LV13,RANK:760 )
|
-
-
17 楼
化繁为简:
其实char也相当于整型 ,只不过只有1 byte,所以直接(char)某数就相当于截取其低8位,上面的表达式也就是将结果转成字串逆序输出,正数直接输,负数只输个负号。
|
能力值:
(RANK:410 )
|
-
-
18 楼
我给你的代码虽然和你的程序不同,但应该已经可以得到正确的答案了吧,只要计算方法流程结果一样,代码相不相同应该没什么关系了。
|
能力值:
( LV6,RANK:90 )
|
-
-
19 楼
|
|
|