第一章:位運算-------出現k次與出現1次

Curtis_發表於2019-03-05

第一章:位運算-------出現k次與出現1次

 

問題:

陣列中只有一個數出現了一次,其他的數都出現了k次,請輸出只出現1次的數。

 

知識點:

2個相同的2進位制數,做不進位加法,結果為0;

10個相同的10進位制數,做不進位加法,結果為0;

k個相同的k進位制數,做不進位加法,結果為0;

 

思路:

將這些數,全部轉換為k進位制數,然後做不進位加,最後將結果轉換為十進位制數。

 

#include<iostream>
#include<algorithm>
//#include<cmath>
using namespace std;

//十進位制數轉K進位制 
string decTok(int dec,int k){
	string ret="";  //作為結果
	
	while(dec>0){
		ret+=char(dec%k+'0');     //如:5+'0'='5' 
		dec/=k;
	} 
	reverse(ret.begin(),ret.end());
	return ret;
}

//K進位制轉十進位制
int kTodec(string str,int k){
	int ans=0;
	for(int i=0;i<str.size();i++){
		ans=ans*k+(str[i]-'0');        //020  首位是最高位 
		//ans+=(str[i]-'0')*pow(k,str.size()-1-i);
	}
	return ans;
} 

int main(){
	int n[]={1,1,1,3,3,3,5,5,5,9,9,9,6,7,7,7};
	int k=3;
	
	string str[16];
	for(int i=0;i<16;i++){
		str[i]=decTok(n[i],k);
	}
	
	//找出16條字串中最大長度
	int maxlen=0;
	int len;
	for(int i=0;i<16;i++){
		len=str[i].size();
		maxlen=max(maxlen,len);     //不能用: maxlen=max(maxlen,str[i].size())
	} 
	
	//16條字串中,若字串長度<maxlen,則進行補齊,以便逐位做不進位加
	for(int i=0;i<16;i++){
		while(str[i].size()<maxlen){
			str[i]="0"+str[i];
		}
	} 
	
	//ans:結果。初始化 
	string ans="";
	while(ans.size()<maxlen){
		ans+="0";
	}
	
	//16條字串做不進位加
	for(int i=0;i<16;i++){
		for(int j=0;j<maxlen;j++){
			ans[j]=char(((str[i][j]-'0')+(ans[j]-'0'))%k+'0');
		}
	} 
	cout<<ans<<endl;
	
	//ans字串結果轉為10進位制數 
	int finalans=kTodec(ans,k);
	cout<<finalans<<endl;
		 
	return 0;
}

結果:

相關文章