计算所有除b余c的n位数的和

来源:互联网 发布:java aws s3 下载文件 编辑:程序博客网 时间:2024/05/31 18:49

C代码如下:

/* * ===================================================================================== * *       Filename:  modnumsum.c * *    Description:  计算被a除余b的units位数的总和 * *        Version:  1.0 *        Created:  2012年11月23日 21时14分57秒 *       Revision:  none *       Compiler:  gcc * *         Author:  Xingwang Su (http://blog.csdn.net/njzhiyuan) *   Organization:   * * ===================================================================================== */#include <stdio.h>#include <unistd.h>#include <getopt.h>#include <math.h>#include <stdlib.h>#include <sysexits.h>#include <libgen.h>long modnumsum(long divisor, long remainder, int units);void usage(char *program);int main(int argc, char *argv[]) {long divisor = 0; //除数long remainder = 0; //余数int units = 0; //被除数的位数int opt;const char *short_options = ":d:r:u:hv";const struct option long_options[] = {{"divisor", required_argument, NULL, 'd'},{"remainder", required_argument, NULL, 'r'},{"units", required_argument, NULL, 'u'},{"help", no_argument, NULL, 'h'},{"Version", no_argument, NULL, 'v'},{NULL, 0, NULL, 0}};while((opt = getopt_long(argc, argv, short_options, long_options, NULL)) != -1) {switch(opt) {case 'd':divisor = atol(optarg);break;case 'r':remainder = atol(optarg);break;case 'u':units = atoi(optarg);break;case 'h':usage(argv[0]);return EX_OK;break;case 'v':return EX_OK;break;case '?':fprintf(stderr, "Invalid option: -%c\n", optopt);return EX_USAGE;break;case ':':fprintf(stderr, "Option: -%c needs an agruments! \n", optopt);return EX_USAGE;break;default:return EX_USAGE;break;}}if (optind < argc) {fprintf(stderr, "Too many arguments! \n");return EX_USAGE;}if (divisor <= 0) {fprintf(stderr, "Invalid divisor: %ld\n", divisor);return EX_DATAERR;}if (units <= 0) {fprintf(stderr, "Invalid units: %d\n", units);return EX_DATAERR;}if (remainder < 0 || remainder > divisor) {fprintf(stderr, "Invalid remainder: %ld\n", remainder);return EX_DATAERR;}printf("The sum for %d figures which mod %ld equals %ld is %ld \n", units, divisor, remainder, modnumsum(divisor, remainder, units));return EX_OK;}long modnumsum(long divisor, long remainder, int units) {long dstart = pow(10, units - 1); //被除数的起始值long dend = dstart * 10 - 1; //被除数的结束值long sum = 0;long rtmp = 0;//计算第一个满足要求的被除数rtmp = dstart % divisor;dstart += rtmp <= remainder ? remainder - rtmp : divisor - (rtmp - remainder);//计算最后一个满足要求的被除数rtmp = dend % divisor;dend -= rtmp >= remainder ? rtmp - remainder : divisor - (remainder - rtmp);//等差数列求和,做了点特殊处理,尽可能地避免溢出dstart /= divisor;dend /= divisor;sum = (dstart + dend) * (dend - dstart + 1) / 2 * divisor + (dend - dstart + 1) * remainder;return sum;}void usage(char *program) {fprintf(stdout, "Usage:\n\t%s OPTIN\n", basename(program));}

执行:

$ gcc --version
gcc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
Copyright © 2012 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。

$ gcc -o modnumsum modnumsum.c -lm


$ ./modnumsum -u 4 -d 8 -r 5
The sum for 4 figures which mod 8 equals 5 is 6188625






原创粉丝点击