« 暗号理論 | トップページ | モチベーション »

2007/10/06

20点問題:平方採中法

今回は20点問題となり少し難しくなってきました。問題はこんなのです。

平方採中法は、生成する乱数の桁数をnとしたとき、初期値sの2乗を計算し、その数値を2n桁の数値とみて、(下の例のように2乗した桁数が足りないときは、0を補います。)その中央にあるn個の数字を最初の乱数とします。次にこの乱数を2乗して、同じ様に、中央にあるn個の数字をとって、次の乱数とします。例えば、123を初期値とすると,

123の2乗    = 00015129 → 0151
151の2乗    = 00022801 → 0228
228の2乗    = 00051984 → 0519
519の2乗    = 00269361 → 2693
2693の2乗   = 07252249 → 2522

の様になります。この方法を用いて、初期値s(10000未満の正の整数)を入力とし、n=4の場合の乱数を10個生成し出力して終了するプログラムを作成してください。

この例のように上位の桁にゼロを置くためには数値をいちど文字列に変換して扱わなければなりません。私はいちおう解けたのですが、ちょっと強引なプログラムです。

//設問3 平方採中法
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

int function(int s)
{
  int n = 4;   //桁数(取り出す桁数はn=4桁に固定)
  int length;  //文字列の長さ
  int i;       //インデックス
  int ans;     //返り値
  char string[9] = "\0\0\0\0\0\0\0\0\0";
  char temp[9]   = "\0\0\0\0\0\0\0\0\0";
  char answer[5] = "\0\0\0\0\0";
  
  //---入力値を2乗---
  s = pow(s, 2);

  //---入力値を文字列に変換---
  sprintf(temp, "%d", s);

  //---文字列の長さを調べる---
  length = strlen(temp);

  //---足りない桁に0を埋める---
  for(i=0 ; i<(8-length) ; i++){
    string[i] = '0';
  }
  //---文字列を連結---
  strcat(string, temp);

  //---真ん中の4桁を取り出す---
  answer[0] = string[2];
  answer[1] = string[3];
  answer[2] = string[4];
  answer[3] = string[5];

  //---文字列を整数に変換---
  ans = atoi(answer);

  return (ans);
}

int main(void)
{
  int s;   //初期値
  int i;   //インデックス
  int ransu;   //乱数

  printf("==========平方採中法==============================\n");

  //---初期値sを入力---
  do{
    printf("input:");
    scanf("%d", &s);
  }while(s<0 || s>=10000);

  printf("---入力---\n%d\n", s);
  printf("---出力---\n");

  //---乱数を10個生成---
  for(i=1 ; i<=10 ; i++){
    ransu = function(s);
    printf("%d\n", ransu);
    s = ransu;
  }
  
  printf("==================================================\n");

  return 0;
}

もっとスマートなプログラムにしたいですねぇ。

|

« 暗号理論 | トップページ | モチベーション »

C」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/222903/16680659

この記事へのトラックバック一覧です: 20点問題:平方採中法:

« 暗号理論 | トップページ | モチベーション »