| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 307 人关注过本帖
标题:帮看下程序
只看楼主 加入收藏
tompobing
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:260
专家分:809
注 册:2012-12-9
结帖率:78.13%
收藏
 问题点数:0 回复次数:6 
帮看下程序
当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。
该校验的过程:
1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。
2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
3、将奇数位总和加上偶数位总和,结果应该可以被10整除。
例如,卡号是:5432123456788881
则奇数、偶数位(用红色标出)分布:5432123456788881
奇数位和=35
偶数位乘以2(有些要减去9)的结果:1 6 2 6 1 5 7 7,求和=35。
最后35+35=70 可以被10整除,认定校验通过。

请编写一个程序,从键盘输入卡号,然后判断是否校验通过。通过显示:“成功”,否则显示“失败”。
比如,用户输入:356827027232780
程序输出:成功









#include "stdio.h"
#include"string.h"
#include"stdlib.h"
#define N 30
 main()
{
    char a[N];
    char *p;
    int k,i;
    int sumj=0,sumo=0;
    printf("please enter any numbers\n");
    gets(a);
    k=strlen(a);
   // printf("%d  ",k);
   atoi(a);
    for(p=a;*p!='\0';p++)
    ;
   p--;
   k=k-1;
    for(i=1;k>=0;p--,k--,i++)
    {
        if(i%2!=0)
          {
              sumj+=(*p);
          }
        if(i%2==0)
          {
              if((*p)*2>9)
                {
                    sumo+=((*p)*2-9);
                }
              else
                {
                    sumo+=(*p)*2;
                }
          }
    }
    printf("%d   %d",sumj,sumo);
       if((sumj+sumo)%10==0)
          printf("ok!!");
          else
          printf("error!!");
}
2012-12-09 17:54
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
程序代码:
#include
#include
#include
#define N 30
int main()
{
    char a[N];
    char *p;
    int k,i;
    int sumj = 0,sumo = 0;
    printf("please enter any numbers\n");
    gets(a);
    k = strlen(a);
//  atoi(a);        //这个函数楼主还是百度看看吧,他的功能不是你想的那样
    for(p = a;*p != '\0';p++)
       *p -= '0';//我在这 这样改,虽然也可以,但不太好
    p--;    k--;
    for(i = 1;k >= 0;p--, k--, i++)
    {
        if(i % 2 != 0)
            sumj += (*p);
        if(i % 2 == 0)
        {
            if((*p) * 2 > 9)
                sumo += ((*p) * 2 - 9);
            else
                sumo += (*p) * 2;
        }
    }
//  printf("%d   %d", sumj, sumo);此句未要求输出
    if((sumj + sumo) % 10 == 0)
        printf("成功\n");    //按要求输出
    else
        printf("失败\n");
    return 0;
}



[fly]存在即是合理[/fly]
2012-12-09 18:14
w527705090
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:441
专家分:1882
注 册:2011-6-28
收藏
得分:0 
敢问,楼主这是程序有错还是什么?楼主运行了程序吗?
我简单看了一下,思路是正确的。

有心者,千方百计;无心者,千难万难。
2012-12-09 18:22
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
回复 3楼 w527705090
他的思路对的

但是想用atoi函数把字符数组转化为整形数组就太滑稽了点,

而实际上,字符数组没有改变 所以后面的数值全错


[fly]存在即是合理[/fly]
2012-12-09 18:47
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
不要用atoi()了,自己实现atoi()的功能,你自己再看看atoi()的用法,
下面这个是对的:
#include <stdio.h>//何必要双引号呢
#include<string.h>
#include<stdlib.h>
#define N 30
int main()
{
    char *p,a[N];
    int m,sumj=0,sumo=0;
    printf("please enter any numbers(%d位以内)\n",N);
    gets(a);
    p=a;
    if(strlen(a)%2!=0)//奇数位数
    {
        while(1)
        {
            sumj+=*p-48;
            if((*(++p))=='\0')
                break;
            m=((*p++)-48)*2;
            sumo+=(m>9?m-9:m);
        }
    }
    else//偶数位数
    {
        while(1)
        {
            m=((*p++)-48)*2;
            sumo+=(m>9?m-9:m);
            sumj+=*p-48;
            if(*(++p)=='\0')
                break;   
        }
    }
    //printf("sumj=%d   sumo=%d\n",sumj,sumo);
    if((sumj+sumo)%10==0)
        printf("ok!!\n");
    else
        printf("error!!\n");
    return 0;
}
图片附件: 游客没有浏览图片的权限,请 登录注册

小小战士,战士中的战斗机!
2012-12-09 18:58
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
楼主的程序是思路正确,主要是没有搞清atoi(a)后a变成了整形还是没有变,出错就在第二个for循环里那块
atoi(a)没有将a转换成整形,第二个for循环里直接加,不错才怪呢

将第二个for循环里的*p全部换成(*p-48)就对了
如下:
#include "stdio.h"
#include"string.h"
#include"stdlib.h"
#define N 30
main()
{
    char a[N];
    char *p;
    int k,i;
    int sumj=0,sumo=0;
    printf("please enter any numbers\n");
    gets(a);
    k=strlen(a);
   // printf("%d  ",k);
   atoi(a);
    for(p=a;*p!='\0';p++)
    ;
   p--;
   k=k-1;
    for(i=1;k>=0;p--,k--,i++)
    {
        if(i%2!=0)
          {
              sumj+=(*p-48);
          }
        if(i%2==0)
          {
              if((*p-48)*2>9)
                {
                    sumo+=((*p-48)*2-9);
                }
              else
                {
                    sumo+=(*p-48)*2;
                }
          }
    }
    printf("%d   %d\n",sumj,sumo);
    if((sumj+sumo)%10==0)
        printf("ok!!\n");
    else
        printf("error!!\n");
}
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 小小战士 于 2012-12-9 19:18 编辑 ]

小小战士,战士中的战斗机!
2012-12-09 19:06
tompobing
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:260
专家分:809
注 册:2012-12-9
收藏
得分:0 
明白了!!!多谢各位啊!!
2012-12-09 19:25
快速回复:帮看下程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017460 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved