[알고리즘 경연 연습 문제] 디지털 암호 발생 기

은행 계좌 등 중요 한 권한 에 비밀 번 호 를 설정 할 때 우 리 는 이런 고민 을 자주 겪 습 니 다. 생일 을 잘 기억 하기 위해 서 라면 쉽게 풀 리 고 안전 하지 않 습 니 다.기억 하기 어 려 운 비밀 번 호 를 설정 하면 자신 도 잊 어 버 릴 까 봐 걱정 된다.종이 에 쓰 여 있 으 면 종이 가 들 키 거나 잃 어 버 릴 까 봐...    이 프로그램의 임 무 는 병 음 자 모 를 6 자리 숫자 (비밀번호) 로 바 꾸 는 것 이다.우 리 는 기억 하기 쉬 운 병 음 꼬치 (예 를 들 어 이름, 왕 희 명, wangximing) 를 입력 으로 하고 프로그램 에서 6 자리 숫자 를 출력 할 수 있 습 니 다.    변환 과정 은 다음 과 같 습 니 다.    첫 번 째 단계 입 니 다. 문자열 6 개 를 한 그룹 으로 접 습 니 다. 예 를 들 어 wangximing 은 다음 과 같 습 니 다.    wangxi     ming      두 번 째 단계. 같은 위치 에 수직 으로 있 는 모든 문자 의 ascii 코드 값 을 더 하면 6 개의 숫자 를 얻 을 수 있 습 니 다. 위의 예 와 같이 다음 과 같 습 니 다.    228 202 220 206 120 105     세 번 째 단계. 모든 숫자 를 '축소' 처리 하 는 것 이다. 즉, 모든 숫자의 숫자 를 더 해서 얻 은 숫자 가 한 자리 숫자 가 아니라면 한 자리 숫자 가 될 때 까지 다시 축소 하 는 것 이다.예 를 들 어 228 = > 2 + 2 + 8 = 12 = > 1 + 2 = 3    위의 숫자 가 줄 어 든 후에 344836 으로 바 뀌 었 습 니 다. 이것 이 바로 프로그램의 최종 출력 결과 입 니 다!    표준 입력 에서 데 이 터 를 받 고 표준 출력 에서 결 과 를 출력 하도록 요구 합 니 다.    입력 형식 은 다음 과 같 습 니 다. 첫 번 째 줄 은 정수 n (< 100) 입 니 다. 아래 에 몇 개의 입력 줄 이 있 는 지, 다음은 n 줄 문자열 입 니 다. 바로 변 경 된 문자열 을 기다 리 는 것 입 니 다.    출력 형식 은 n 줄 변환 후의 6 자리 암호 입 니 다.    예 를 들 어 입력: 5 zhangfeng wangximing jiujingfazi woaibeijingtianmen haohaoxuexi    출력: 772243 344836 297332 716652
875843
코드 구현
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define MAXLEN 100

void makePass(char **str,char **pwd,int n)
{
	int sum[6] = {0};//         ASII    
	int cur = 0;//    ,               
	for(int i=0;i<n;++i)
	{
	//	memset(sum,0,sizeof(sum));//          ,           
		for(int l=0;l<6;++l)
		{
			sum[l] = 0;
		}
		cur = 0;
		while(*(str[i]+cur)!='\0')//  ,             
		{
			sum[cur%6] += (int)*(str[i]+cur);//      ASII      
			cur++;	//  ,              
		}
		
		for(int j=0;j<6;++j)
		{
			int temp = sum[j];//  ,     i 
			while(temp>=10)//   ASII             
			{
				int resolve = temp;
				temp = 0;//  ,                   
				while(resolve!=0)
				{
					temp += resolve%10;
					resolve /= 10;
				}
			}
			
			pwd[i][j] = temp+'0';//                     
		}
		pwd[i][6] = '\0';
	}
}

int main()
{
	int n;
	char **str;
	char **pwd;
	int arr[10]; 
	scanf("%d",&n);
	str = (char **)malloc(sizeof(char *)*n);
	pwd = (char **)malloc(sizeof(char *)*n);
	for(int i=0;i<n;++i)
	{
		str[i] = (char *)malloc(sizeof(char)*MAXLEN);
		pwd[i] = (char *)malloc(sizeof(char)*6);
		scanf("%s",str[i]);
		getchar();
	}
	makePass(str,pwd,n);
	for(int i=0;i<n;++i)
	{
		printf("%s
",pwd[i]); } return 0; }

좋은 웹페이지 즐겨찾기